说明

事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题

并发访问的问题 含义
脏读 一个事务读取到了另一个事务中尚未提交的数据。最严重,杜绝发生。
不可重复读 一个事务中多次读取的数据内容不一致,要求的是一个事务中多次读取时数据是不一致的,这是事务update时引发的问题
幻读(虚读) 一个事务内读取到了别的事务插入或者删除的数据,导致前后读取记录行数不同。这是insert或delete时引发的问题

脏读

指一个事务读取了另外一个事务未提交的数据(非常危险)
MySQL_事务_事务的并发访问引发的3个问题 - 图1

时间 session1 session2
T1 start transaction; start transaction;
T2 原来数据:a=1000;b=1000
update:a=900;b=1100
T3 select:a=900;b=1100
此时session1读取了session2未提交的数据,这种现象叫做脏读
T4 rollback;最糟糕的情况

不可重复读

在一个事务内多次读取表中的数据,多次读取的内容不同
不可重复读就是一个事务读取了其他事务提交前后的数据,造成2次读取不一致的情况,多发生在其他事务 update 操作时
MySQL_事务_事务的并发访问引发的3个问题 - 图2

时间 session1 session2
T1 start transaction; start transaction;
T2 select:a=1000;b=1000;
T3 原来数据:a=1000;b=1000 update:a=900;b=1100
commit;提交事务
T4 再次查询:select:a=900;b=1100;
此时读取的数据与上一次读取的数据内容不一致,这种现象叫做不可重复读

说明:发生不可重复读的前提是1)事务多次读取相同条件下的数据2)另一个事务修改(update)完毕后事务进行了提交操作;

幻读(虚读)

一个事务内读取到了别的事务插入或者删除的数据,导致前后读取记录数不同,多发生在 deleteinsert
MySQL_事务_事务的并发访问引发的3个问题 - 图3

时间 session1 session2
T1 start transaction; start transaction;
T2 count(*);— 2
T3 insert into …(插入1条记录)
commit;事务提交
count(*)=3
T4 再次统计:count()=3
此时事务1前后读取的记录数不一致的现象叫做*虚读