标签:
1. 地球人都知道的,但往往你就不能说出口,所以事务的相关概念还是有必要提一下
事务特性(ACID特性)
事务隔离级别
由弱到强分别是:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE
ps:MySQL的默认事务隔离级别是REPEATABLE_READ,ORACLE、SQL Server、DB2和PostgreSQL的默认事务隔离级别是READ_COMMITED。
2. 事务到底是做什么的呢?下表是这四种事务隔离级别对脏读、不可重复读和幻读的支持情况:
隔离级别 | 丢失更新 |
脏读 (Dirty read) |
不可重复读 (Non-repeatable read) |
覆盖更新 |
幻读 (Phantom read) |
READ_UNCOMMITED | 允许 | 允许 | 允许 | 允许 | 允许 |
READ_COMMITED | 不允许 | 不允许 | 允许 | 允许 | 允许 |
REPEATABLE_READ | 不允许 | 不允许 | 不允许 | 不允许 | 允许 |
SERIALIZBLE | 不允许 | 不允许 | 不允许 | 不允许 | 不允许 |
数据库并发问题可以归结为下面几类:
3.这几种事务级别到底是怎么工作的呢?
1)SERIALIZABLE:
添加范围锁(比如表锁,页锁等),直到transaction A结束。以此阻止其它transaction B对此范围内的insert,update等操作。
幻读,脏读,不可重复读等问题都不会发生。
2)REPEATABLE READ(可重复读)
对于读出的记录,添加共享锁直到transaction A结束。其它transaction B对这个记录的试图修改会一直等待直到transaction A结束。
可能发生的问题:当执行一个范围查询时,可能会发生幻读。
3)READ COMMITTED(提交读)
在transaction A中读取数据时对记录添加共享锁,但读取结束立即释放。其它transaction B对这个记录的试图修改会一直等待直到A中的读取过程结束,而不需要整个transaction A的结束。所以,在transaction A的不同阶段对同一记录的读取结果可能是不同的。
可能发生的问题:不可重复读。
4)READ UNCOMMITTED(未提交读)
不添加共享锁。在transaction A中可以读取到transaction B(未提交)中修改的数据。比如transaction B对R记录修改了,但未提交。此时,在transaction A中读取R记录,读出的是被B修改过的数据。
可能发生的问题:脏读。
标签:
原文地址:http://www.cnblogs.com/yhzh/p/5209574.html