并发带来的问题

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时,消除了幻读。