事务是隔离还是不隔离?

读已提交和可重复读会默认开启视图 read view
视图概念
1.一个是view,他是查询语句定义的虚拟表
2.另一个是innodb在实现mvcc时用到的一致性视图,read view,拥有支持读已提交、可重复读隔离级别的实现
快照在mvcc是怎样工作的
1.innodb为每个事务构造了一个数组,用来保存事务启动时的数据库状态
2.数组中保存了两个信息
    - 事务id
    - 事务对数据库的修改操作
3.innodb利用每个事务有多个版本的特性,实现了“秒级创建快照”的能力
4.更新数据都是先读后写,称之为“当前读”
事务的可重复读的能力是怎么实现的?
1.事务在启动时会创建一个快照,快照中会记录当前系统中所有其他事务id
2.事务在读取数据时,会根据事务id和快照中的其他事务id来判断数据是否可见
3.如果事务id在快照中,则数据可见,否则数据不可见
4.事务在更新数据时,会先读取数据,然后根据事务id和快照中的其他事务id来判断数据是否可见
5.如果数据可见,则更新数据,否则抛出异常
innodb的行数据会有多个版本,每个版本数据都有自己的row id,每个事务或语句都有自己的一致性视图。
对于可重复读,查询只承认在事务启动前就已经提交的数据
对于读已提交,查询只承认在语句启动前就已经提交的事务
为什么现在大部分企业使用的是读已提交而非可重复读?
1. 锁竞争减少,在并发情况下,可以减少不同事务之间锁的等待时间,提高系统整体吞吐量
2. 减少死锁可能性
3. 对数据一致性要求
posted @ 2025-03-03 16:23  花花妹子。  阅读(13)  评论(0)    收藏  举报