目录
A. 事务的基本要素
B. 事物并发,问题
C. mysql事物隔离级别
D. mysql默认隔离级别,可重复读(repeatable-read)
D.1. 出现幻读的情况
D.2. 验证快照的生成方式
E. 串行化(serializable)
F. 读已提交(read-committed)
F.1. 不可重复读
1. 原子性
2. 一致性
3. 隔离性
4. 持久性
1. 脏读 , 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据(在B未提交的时候,A就能看到B修改的数据)
2. 不可重复读 , 事物A对同一条数据多次读取的结果不同,(在事物A读取期间,事物B对数据进行了更新操作,然后提交,事物A能够看到事物B的更新操作),解决方式:锁住符合条件的行
3. 幻读, 事物A对数据进行修改结束后,发现和预期的修改结果不一致。解决方法:锁住表
事物A在没有提交的时候,事物B对该条数据的修改操作是“阻塞状态”(针对于新增的那条数据)
事物A 修改,提交后,事物B 也对某条数据进行了修改,提交后,发现结果不是事物A想要的结果(针对于修改的那条数据)
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
可重复读(repeatable-read),执行第一条语句的时候准备的快照,准备快照的方法则是记录当前事务的版本号,没有进行数据的复制在
-- 数据库设置为 可重复读 隔离级别
set session transaction isolation level read committed;
左,右两边都开启了事物
在执行到第3步后,第4步能够查到数据
第5步,查不到数据
如果不执行 第6步, 则第7步,会一直阻塞,
当右边执行完commit后(第6步)
第7步执行成功(出现幻读)
同时也验证了幻读( 左边事物查到了右边事物的数据,不完全算幻读,不要对概念扣得这么真 )
左边事物开启后不执行任何语句(在执行第一条语句的时候,会生成该事物的快照)
右边事物进行修改操作后,提交
左边出现幻读,能够读到该条数据。
事物A 未提交之前,事物B无法进行操作。
可重复读(repeatable-read) 与 读已提交(read-committed) 的区别,一个有快照(可重复读,在事务A中执行第一条SQL 的时候才会生成快照,如果开启事物A后不执行SQL ,等待事物B修改完数据,提交之后,再在事物A中查看,则能看到事物B修改的数据),一个没有快照(读已提交)
不可重复读:意思是,一个事物中多次查询的结果,不相同,由于 可重复读(repeatable-read) 生成一个快照,不会查询到另外一个事物修改的内容,所以实现了 可重复读,即多次查询都能查到相同的结果
右边的事物对数据进行修改后,提交,左边的事物,能够立即看到修改的内容