04|事务的隔离级别

在这里插入图片描述

数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是
使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。
同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复
读"和“幻读”并不敏感,可能更关心数据并发访问的能力。
查看当前数据库的事务隔离级别: show variables like ‘tx_isolation’;
设置事务隔离级别:set tx_isolation=‘REPEATABLE-READ’;

务隔离级别主要解决事务的并发问题,事务隔离级别越高并发度越低
Mysql默认的事务隔离级别是可重复读,用Spring开发程序时,如果不设置隔离级别默认用Mysql设置的隔离级别,如果Spring设置了就用已经设置的隔离级别

1. 读未提交

客户端A: 客户端A更新数据先不提交
客户端B:客户端B读取到客户端A未提交的数据

2. 读已提交

1.打开一个客户端A,并设置当前事务模式为read committed(未提交读),查询表account的所有记录
2/在客户端A的事务提交之前,打开另一个客户端B,更新表account
3. 客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题
4. 客户端B的事务提交
5. 客户端A执行与上一步相同的查询,结果与上一步不一致,即产生了不可重复读的问题

3. 可重复读

可重复读隔离级别在事务开启的时候,第一次查询是查的数据库里已提交的最新数据,这时候全数据库会有一个快照,在这个事务之后执行的查询操作都是查快照里的数据,别的事务不管怎么修改数据对当前这个事务的查询都没有影响,但是当前事务如果修改了某条数据,那当前事务之后查这条修改的数据就是被修改之后的值,但是查其它数据依然是从快照里查,不受影响

可重复读的隔离级别下使用了MVCC(multi-versionconcurrency control)机制,
select操作是快照读(历史版本);
insert、update和delete是当前读(当前版本)

在这里插入图片描述

使用Java代码进行更新

注意点:数据的运算不能通过JAVA代码操作,代码操作的运算值并不是数据的最新值会出现一致性问题
如果使用Java在代码层面实现运算可以考虑使用乐观锁的方式(有点类似CAS的思想)
前提条件先引入一个version字段记录更新的版本信息
在这里插入图片描述
在这里插入图片描述

读已提交和可重复MVCC原理

在这里插入图片描述

4. 串行化

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值