与事务有关的数据并发问题
1. 脏读(Dirty Read)
事务A读到事务B尚未提交的数据,并基于这个数据进行后续操作。
脏读强调的是:A事务读到的不够新
Transaction 1 | Transaction 2 |
/* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 20 */
| |
| /* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; /* No commit here */
|
/* Query 1 */ SELECT age FROM users WHERE id = 1; /* will read 21 */
| |
| ROLLBACK; /* lock-based DIRTY READ */
|
2. 不可重复读(Unrepeatable Read)
事务A读取数据后,被事务B修改或删除,事务A再次读取时前后两次读取的数据不一致。
不可重复读强调的是: 同一事务,两次读取到的数据不一样。
Transaction 1 | Transaction 2 |
/* Query 1 */ SELECT * FROM users WHERE id = 1;
| |
| /* Query 2 */ UPDATE users SET age = 21 WHERE id = 1; COMMIT; /* in multiversion concurrency control, or lock-based READ COMMITTED */
|
/* Query 1 */ SELECT * FROM users WHERE id = 1; COMMIT; /* lock-based REPEATABLE READ */
|
3. 虚读/幻象读(Phantom read)
事务A读取数据后,事务B新增了数据,事务A再次读取是前后两次读取的数据不一致。
虚读强调的是:记录的条数发生了变更。
Transaction 1 | Transaction 2 | |
/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30;
| | |
| /* Query 2 */ INSERT INTO users VALUES ( 3, 'Bob', 27 ); COMMIT;
| |
/* Query 1 */ SELECT * FROM users WHERE age BETWEEN 10 AND 30;
|
4. 第一类更新丢失
事务A和事务B同时访问并修改同一个数据,事务B先提交修改,事务A回滚操作。导致事务B的修改丢失。
5. 第二类更新丢失
事务A和事务B同时访问并修改同一个数据,事务B先提交修改,事务A再提交。导致事务B的修改被覆盖。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/238581/viewspace-751211/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/238581/viewspace-751211/