一、事务四大特性ACID
1.1 原子性
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
事务是一组操作,这组操作是不可分割的最小操作单元,表示这组操作的内容要么全部执行成功,如果有一个操作没有成功,那么这组操作全部执行失败。
1.2 一致性
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
例如在进行转账操作时,一个账户给另一个用户转账,不管这个操作最终成功,还是因为转账失败回滚,最后这两个账户的余额相加都是一致的。
1.3 隔离性
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
隔离性指的是有若干个并发事务,比如有两个事务,事务1和事务2都在同时操作这个数据库,事务1去操作的时候不会影响并发的事务2的执行,事物2去操作的时候也不会影响并发的事务1去执行,这两个事务是在独立的环境下运行的。
1.4 持久性
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
数据库当中的数据最终是存放在磁盘当中的,一个事务不管是操作成功提交了还是操作异常回滚了,最终对数据库的改变是永久的保留到磁盘中的。
二、并发事务问题
2.1 脏读
- 一个事务读到另外一个事务还没有提交的数据。
有两个并发执行的事物,事务A要进行select和update操作,事务B执行select操作,它们操作的是同一个数据库,当事务A执行完update操作还没有提交时,事务B进行了select操作,这时就查出了事务A将要修改但还没有提交修改的数据,这被称为脏读。
2.2 不可重复读
- 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
有两个并发事务,事务A有4个操作,第一个操作是select(id=1)一个数据,事务A在进行第二个操作时,事务B对事务A第一次查询的数据进行了修改,并且提交了这次修改,接着事务A进行第三个操作,依然是select(id=1),与第一个操作一样,但这次查到的数据发生了改变,这就是不可重复读。
2.3 幻读
- 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。
有两个并发事务,事务A进行了select(id=1)的操作,在提交前事务B进行了insert(id=1)的操作,并且提交完成,此时数据库当中已经有了id为1的数据,接下来事务A进行insert(id=1)的操作,此时会提示插入失败,因为事务B已经插入了id为1的数据,此时事务A再次进行select(id=1)的操作,但还是没有查到(已经解决了不可重复读的问题了),这就类似出现了幻觉,这个现象称之为幻读。
三、事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted | √ | √ | √ |
Read committed(Oracle默认) | × | √ | √ |
Repeatable Read(MySQL默认) | × | × | √ |
Serializable | × | × | × |
- 查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
- 设置事务隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL {Read uncommitted|Read committed|Repeatable Read|Serializable } ;
3.1 脏读演示
- Read uncommitted:
- Read committed:
3.2 不可重复读演示
3.3 可重复读演示