说明
事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题
| 并发访问的问题 | 含义 |
|---|---|
| 脏读 | 一个事务读取到了另一个事务中尚未提交的数据。最严重,杜绝发生。 |
| 不可重复读 | 一个事务中多次读取的数据内容不一致,要求的是一个事务中多次读取时数据是不一致的,这是事务update时引发的问题 |
| 幻读(虚读) | 一个事务内读取到了别的事务插入或者删除的数据,导致前后读取记录行数不同。这是insert或delete时引发的问题 |
脏读
指一个事务读取了另外一个事务未提交的数据(非常危险)
| 时间 | 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 操作时
| 时间 | 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)完毕后事务进行了提交操作;
幻读(虚读)
一个事务内读取到了别的事务插入或者删除的数据,导致前后读取记录数不同,多发生在 delete 或 insert 时
| 时间 | session1 | session2 |
|---|---|---|
| T1 | start transaction; | start transaction; |
| T2 | count(*);— 2 | |
| T3 | insert into …(插入1条记录) commit;事务提交 count(*)=3 |
|
| T4 | 再次统计:count()=3 此时事务1前后读取的记录数不一致的现象叫做*虚读; |
