并发带来的问题
1.脏读dirty read
脏读的问题是transaction读到了没有被提交的数据。例如,T1更新了data1,还没提交,这时T2读取了更新后的data1, 用于计算和更新别的值, 然后T1又回滚了data1。
如果是隔离级别是read commited, 那么T1就会对data1加exclusive lock, T2要等待T1释放锁才能读取到,就避免了脏读。
2. 不可重复读 nonrepeatable read,
不可重复读就是, transaction每次读一行都会得到不同的值。例如, T1读了一行数据data1, 这时T2更新或删除了data1,并提交,T1再次读取data1,就会发现data1值变了。
3. 幻读 Phantoms,
T1在查询某些数据,这时T2插入一些符合T1查询条件的数据,T1再次查询就会得到不同的结果。 这就是幻读。
ANSI/ISO SQL定义了4种隔离级别,请看下表中这些隔离级别和以上问题的关系
Isolation Level | Dirty Read | Nonrepeatable Read | Phantom Read |
READ UNCOMMITTED | Permitted | Permitted | Permitted |
READ COMMITTED | -- | Permitted | Permitted |
REPEATABLE READ | -- | -- | Permitted |
SERIALIZABLE | -- | -- | -- |
可见,
READ UNCOMMITED时, 问题1,2,3都有可能发生。
READ COMMITED时, 消除了脏读问题
REPEATABLE READ时,消除了不可重复读问题
SERIALIZABLE时,消除了幻读。