事务的隔离级别

事务的隔离级别:
事务并发问题如何发生?
当多个事务同时操作同一个数据库的相同数据时,如果没有采取必要的隔离机制,会导致事务的并发问题:
1.脏读:一个事务读取到了另外一个事务未提交的数据
2.不可重复读:一个事务读取数据时,另外一个事务对该数据进行更新,第一个事务再次读取同一个数据,值就不同了。同一个事务中,多次读取到的数据不一致。(重点是修改)
3.幻读:一个事务读取数据时,另外一个事务插入了新数据,导致第一个事务读取到了没有更新的数据(重点在新增或删除)

如何避免事务的并发问题?→通过设置事务的隔离级别
事务的隔离级别: .
脏读 不可重复读 幻读
read uncommitted √ √ √
read committed × √ √
repeatable read × × √
serializable × × ×

mysql中默认第三个隔高级别repeatable read
oracle中默认第二个隔高级别read committed
命令:
查看当前的隔高级别
select @@transaction _isolation;
设置当前连接的隔离级别
set session/global transaction isolation level隔离级别;

1、READ UNCOMMITTED(读&未提交) 允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现
查看默认隔离级别(8.0之后的版本需要用select @@transaction _isolation;)

将隔离级别设置为最低的才可以实现脏读、不可重复读、幻读

这里start transaction;可选的

该事务开启了,但没有自动提交,所以到这一步还没结束。
重新打开一个连接
改隔离级别→设置为最低隔离级别→使用库→新开启一个事务

在此事务执行过程中,从account表看出已经将其改为Jack,但实际并没有提交,因此此时读到的数据就被称为脏数据。
若执行回滚,再去查看,又变回张三了,这种现象称为不可重复读和幻读
因此在READ-UNCOMMITTED的级别下,以上三种现象都可能出现。

2、READ COMMITTED (读&已提交) 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现
设置READ COMMITTED级别→重新开启事务

左边更新数据为Rose,右边数据依然显示李四,这样是正确的,说明可以避免脏读
但不能避免不可重复读和幻读,如下:

左边的事务进行提交,而右边的事务没有结束,再一个事务的多次查询中,两次查询的结果不一致,因此这种现象被称为不可重复读

3、REPEATABLE READ 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读、不可重复读,但幻读的问题依然存在

左边事务A 中将数据更新为Tom,而在右边事务B中并没有改变,所以没有脏读

但事务A执行了提交,事务B还是不变,所以对于同一个事务多次查询结果一致,即成功
如何实现更新?→提交事务B→再新开启一个事务→再查看

因此,REPEATABLE READ 可以避免脏读、不可重复读,但是不能解决幻读

演示幻读:(针对插入)
在事务A中:

在事务B中:
第一步如果刚才有其他操作,最好线提交,
然后开启事务

事务B提交后,在事务A中本应是2行受影响,但却是3行受影响

运行效果查看:

4、SERIALIZABLE串行化 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可以避免脏读、不可重复读和幻读,性能低。
更改为最高隔离级别,这里可以解决任何事物并发问题了
事务A 中:
在操作某些数据后,一般在更改隔离级别之前先提交
开启事务→查看表→更改表中数据(但是不执行此命令)

在事务B中:

注:这里插入数据,但是被阻塞操作(不能插入),因此并不能回车
类似于Java的等待操作,这里一直在等待事务A释放锁

小结:
使用串行化可以禁止其他事务对该表执行插入,更新和删除操作,因此,所有并发问题都可以避免,但性能十分低下。

#delete和truncate在事务使用时的区别:
delete支持回滚,假如结束事务时用的rollback,则还可以撤销,相当于还原到删除之前。

truncate在事务执行过程中,即使执行了回滚,但删除操作已经提交到了磁盘文件,
因此truncate是实际的删除,不支持回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值