关键词:一致性、隔离性、幻读、
前言:
假设此时事务A和事务B同时执行。
一、事务的定义&&特性:
1、定义:
2、事务的特性:
详见:https://blog.csdn.net/chosen0ne/article/details/10036775
二、事务的一致性与隔离性的分析:
1、一致性:
(1)定义:
事务保证系统从某一个一致性状态转变为另外一个一致性状态。
(2)分析:
老梁向小梁转账,假设转账之前这大小梁的钱加起来总共是10000,那么老梁向小梁转账之后,不管这两个账户怎么转,老梁的钱和小梁的钱加起来的总额必须还是10000,这个就是事务的一致性。
2、隔离性:
(1)定义:
并发事务执行过程中,不同的事务之间相互隔离执行的一个特性。
(2)隔离级别:
事务的隔离强度:Read Uncommitted < Read Committed < Repeated Read < Serialization
详见:https://baijiahao.baidu.com/s?id=1629344395894429251&wfr=spider&for=pc
(3)并发事务执行过程中会产生的三个问题:
(4)"隔离级别"与"产生的问题"的详细分析:
①不同隔离级别会产生的问题:
- Read Uncommitted级别:脏读、不重复读、幻读
- Read Committed级别:不重复读、幻读
- Repeated Read级别:幻读
- Serialization级别:都不会产生
(5)不同隔离级别下的读操作和写操作下的读和写操作的区别:
前提:重点分析Repeatable Read级别和Serialization级别;innodb引擎。
- 事务A写:会加X锁,此时事务B肯定不能进行任何操作;
- 事务A读:对于快照读,通过MVCC来控制增删改查等操作;对于当前读,除了对当前记录加锁之外还需要结合gap锁来对记录的间隙加锁以保证了事务B只能读取数据而不能进行其他写操作。
- 不管是读还是写,都是串行化的。事务A在操作的时候,事务B只能等待。
(6)如何实现Read Commit隔离级别下的效果:
①效果:当前事务只能读其他事务已提交的记录:
②分析:
InnoDB 支持行锁,进行写操作时加的是行级中的排他锁,那么当其他事务访问另一个正在update (除select操作外其他操作本质上都是写操作)同一条记录的事务时,事务的读操作会被阻塞。所以只能等到记录(其实是索引上的锁)上的排他锁释放后才能进行访问,也就是另一个事务提交之后才能够访问。这样确实就实现read commited隔离级别的效果。
参考: