总共有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。