- 演示事务的隔离级别
- set后面加session比较好,不加直接查看当前隔离级别没有马上生效,效果没出来,加session代表设置当前会话或连接隔离级别,比如说两个cmd窗口的事务就是不同的会话,
事务的隔离级别是全局变量
看事务的隔离级别,并修改为(第一种)最低隔离级别 read-uncommitted(读未提交数据)
最低的隔离级别会出现脏读,不可重复读,幻读的情况
- 事务1更新数据,但未提交
- 事务2读取更新后的’john’临时数据,出现脏读
- 若事务1回滚后,事务2再次读取数据,会回到更新前的’张无忌’的数据,出现不可重复读或幻读
第二种隔离级别: read-committed(读已提交数据)
可以解决脏读,但不能解决不可重复读,幻读
- 分别查看两个不同事务的隔离级别
- 开启事务1,更新数据,在事务1还未结束的情况下,
- 开启事务2,并查看数据,发现数据没有被修改,说明避免了脏读,但是还是不能避免不可重复读和幻读
- 假如事务1提交了,但是事务2还没有结束,且在同一个事务2的多次查询下,会发现两次查询结果不一样,所以把这种现象称为不可重复读
事务1:
事务2:
第三种隔离级别: repeatable-read(可重复读)
可以解决脏读,不可重复读,但不能解决幻读
- 设置两个事务的隔离级别为repeatable read,开启事务1,事务2;
事务1修改数据,但未提交
-
事务2显示数据没有改为’‘刘备’’,避免了脏读
-
若事务1提交了,
- 事务2再次查询,数据还是不变,所以说对于同一个事务2多次查询来说,结果是一样的,解决了不可重复读的问题
当前事务2提交后再开一个新事务2,再次查询数据就是最新的
- 第三种隔离级别幻读的情况
1.重新开启两个事务,先在事务1中查看一下原本数据,
2.在事务2中插入新的数据,并且提交
3.在事务1中重新查询一下数据仍然还是2行,但是把所有的account表的username数据改为新的实际修改了3行,犹如出现幻觉,所以称为幻读.(幻读一般就针对插入数据)
事务2先一步修改了数据并且提交了,会造成事务1本来修改两行结果变成了3行
第四种最高隔离级别: serializable(串行化)
可以解决三种问题, 但是性能低
1.设置隔离级别为最高级别,开启两个事务,在事务1下查询数据,但未提交
2.在事务2中插入新数据,但事务2阻塞,只有事务1结束后才能执行事务2,因此解决了幻读的问题
事务的隔离级别:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | √ | √ | √ |
read uncommitted | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |