锁定老帖子 主题:图说事务隔离级别
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||
发表时间:2011-10-19
最后修改:2011-10-19
我们经常说的事务隔离级别,一般指的是SQL-92标准中定义的四个级别。分别是:
根据字面意思,分别解释如下:
事务A更新了数据,但没有提交(commit),允许事务B读到这条变化的数据。如果事务A最终没有提交,而是rollback回原来的状态,那么事务B读到的数据就是一条脏数据。
图1 未提交读
事务A在更新数据并且提交后,才允许事务B读取到,这样就可以避免脏读。
图2 提交读
Read Committed并不能防止不可重复读和幻读,什么是不可重复读和幻读?看下图
不可重复读是事务B在多次读取数据过程中,事务A对数据进行更新或者删除,导致事务B前后读到的数据不一致。
图3 不可重复读
幻读是事务B在多次读取过程中,事务A对数据新增了,导致事务B后读的数据比之前读的多了,感觉像是凭空出来的一样。
图4 幻读
图5 可重复读
显然,要实现可重复读,需要事务B在读取数据后,对SELECT的数据加锁,事务A不能修改,这可以通过“共享读锁”和“排它写锁”来实现。可重复读不能避免幻读。
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。这样可以避免幻读,但是,这样的事务级别,性能也最差。
图6 序列化事务
下面是隔离级别及其对应的可能出现或不可能出现的现象
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2012-01-30
说实话,数据库课只讲了脏读,其它不知道老师没讲还是我不记得了,呵呵
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2012-01-30
Serializable 序列化
讲的不准确, LZ提到的是数学上的Serializable, 实际数据库实现中,的Serializable事务隔离级别, 并没有采用数学上的序列化那么严格的做法,因为性能上会大大下降。 |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2012-07-21
lettoo 写道
我们经常说的事务隔离级别,一般指的是SQL-92标准中定义的四个级别。分别是:
根据字面意思,分别解释如下:
事务A更新了数据,但没有提交(commit),允许事务B读到这条变化的数据。如果事务A最终没有提交,而是rollback回原来的状态,那么事务B读到的数据就是一条脏数据。
图1 未提交读
事务A在更新数据并且提交后,才允许事务B读取到,这样就可以避免脏读。
图2 提交读
Read Committed并不能防止不可重复读和幻读,什么是不可重复读和幻读?看下图
不可重复读是事务B在多次读取数据过程中,事务A对数据进行更新或者删除,导致事务B前后读到的数据不一致。
图3 不可重复读
幻读是事务B在多次读取过程中,事务A对数据新增了,导致事务B后读的数据比之前读的多了,感觉像是凭空出来的一样。
图4 幻读
图5 可重复读
显然,要实现可重复读,需要事务B在读取数据后,对SELECT的数据加锁,事务A不能修改,这可以通过“共享读锁”和“排它写锁”来实现。可重复读不能避免幻读。
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。这样可以避免幻读,但是,这样的事务级别,性能也最差。
图6 序列化事务
下面是隔离级别及其对应的可能出现或不可能出现的现象
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
浏览 4598 次