总共有4钟transaction isolation. Serializable level的transaction,并发运行和挨个执行的结果是一样的。并发的transaction会产生缺陷(phenomena)。Serialization level 的transaction不会有这些缺陷(phenomena)。
在不同transaction levels 中被消灭的缺陷(phenomena)
|
sex |
name |
|
male |
李雷 |
|
female |
韩梅梅 |
Dirty read: 多条并发transaction中,一个transaction中的sql读取了另一个transaction未提交(committed)的数据。
脏读:
|
transaction1 |
transaction2 |
|
Begin: |
Begin: |
|
Select * from user where sex=’male’; 查出:李雷 |
|
|
|
Insert into user (‘Jack’, ‘male’) |
|
Select * from user where sex=’male’; 查出:李雷和 Jack |
|
|
|
commit |
Nonrepeatable read: 在一个transaction中,一条数据被先后读了两次。由于这中间另外一个transaction修改了这条数据,并提交了,导致第二次读出来的数据和第一次不一样。
|
transaction1 |
transaction2 |
|
Begin: |
Begin: |
|
Select * from user where sex=’male’; 查出:李雷 |
|
|
|
Insert into user (‘Jack’, ‘male’) |
|
|
commit |
|
Select * from user where sex=’male’; 查出:李雷和 Jack |
|
|
|
|
Phantom read: 在一个transaction中,一条查询sql执行了两次。由于中间有另一个transaction提交了数据,导致两次查出来的数据集不同。
|
transaction1 |
transaction2 |
|
Begin: |
Begin: |
|
Select * from user where sex=’male’; 查出:李雷 |
|
|
|
Insert into user (‘Jack’, ‘male’) |
|
|
commit |
|
Select * from user where sex=’male’; 查出:李雷和 Jack |
|
|
|
|
Serialization anomaly:多个transaction并发执行的结果和挨个执行的结果不同。
|
transaction1 |
transaction2 |
|
Begin: |
Begin: |
|
Select * from user where sex=’male’; 查出:李雷 |
|
|
|
Insert into user (‘Jack’, ‘male’) |
|
|
commit |
|
Insert into user (‘MR李雷, ‘male’) 必须要有这条插入语句,因为只读事务不会混滚 |
|
|
Commit; 提交的时候会回滚,因为查询语句在事务的中途失效了。 |
|
|
|
|
不同的事务隔离级别对应解决的问题
|
Isolation level |
Dirty read |
Nonrepeatable read |
Read phantom |
Serialization anomaly |
|
Read uncommitted |
×(only in PostgreSQL) |
|
|
|
|
Read committed |
× |
|
|
|
|
Repeatable read |
× |
× |
×(only in PostgreSQL) |
|
|
serialization |
× |
× |
× |
× |
提醒
Sequence的变化会立即同步给并发的transaction,并且不会因为某一个transaction回滚而回滚squence。同理还有serial。
本文深入解析了四种事务隔离级别:Serializable、Read Committed、Repeatable Read 和 Read Uncommitted,在并发场景下如何避免脏读、不可重复读、幻读及序列化异常等现象。通过具体的例子说明了每种隔离级别对这些问题的解决程度。
4462

被折叠的 条评论
为什么被折叠?



