MySQL数据库 -- 6.事务
✅一、事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
✅二、事务操作
操作 | 语法 |
---|---|
开启事务 | START TRANSACTION 或 BEGIN; |
提交事务 | COMMIT; |
回滚事务 | ROLLBACK ; |
✅三、事务四大特性
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
✅四、并发事务问题
- 脏读:一个事务读到另外一个事务还没有提交的数据。
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影”。
✅五、事务隔离级别
读未提交
这是最低的隔离级别,允许事务读取其他事务未提交的数据。
注意,此时
事务A
还未COMMIT
,若事务A
执行ROLLBACK
,则先前事务B
读到的数据就是脏数据。这种行为被称为 脏读(Dirty Read)。读已提交
读已提交只允许事务读取其他事务已提交的数据,避免了脏读。
事务A
还未COMMIT
时,事务B
读取到的数据还是事务A
修改前的老数据。不过,在同一个事务中,多次读取同一数据时,可能会得到不一样的数据,这便是不可重复读(Non-Repeatable Read)。
如果
事务B
有两次读取的操作,第一次执行读取的时机是事务A
提交前,由于读已提交的隔离级别,事务B
读取到的还是老数据;第二次执行读取的时机是事务A
提交后,此时事务B
读取到的就是新数据,与之前的老数据不同(注意,事务B
的执行始终没有停止)。这便是不可重复读。可重复读
这是 MySQL 默认的隔离级别,确保同一事务在读取同一数据时,得到的结果始终是一致的,避免了不可重复读。
也就是说,即使其他事务修改并提交了数据,当前事务再次读取时看到的还是原来的数据。这通过多版本并发控制(MVCC) 来实现的。
虽然解决了不可重复读的问题,但还是可能出现幻读(Phantom Read)。
串行化:事务串行化执行,事务只能一个接着一个地执行,、,并且在执行过程中完全看不到其他事务对数据所做的更新;缺点是并发能力差,最严格的事务隔离,完全符合ACID原则,但是对性能影响比较大
隔离级别 | 脏读 | 不可重复读 | 幻读 | 并发性能 | 隔离力度 |
---|---|---|---|---|---|
READ UNCOMMITTED | ❌ | ❌ | ❌ | 高 | 最低 |
READ COMMITTED | ✅ | ❌ | ❌ | 中 | 低 |
REPEATABLE READ(默认) | ✅ | ✅ | ❌ | 低 | 中 |
SERIALIZABLE | ✅ | ✅ | ✅ | 最低 | 高 |