隔离级别

隔离级别用于决定如何控制并发用户读写数据的操作。可以在会话级别上用会话选项来设置隔离级别,也可以在查询级别上用表提示来设置隔离级别。可设置的隔离级别有6个:

  • READ UNCOMMITTED - 未提交读
  • READ COMMITTED - 已提交读,默认值
  • REPEATABLE READ - 可重复读
  • SERIALIZABLE - 可序列化
  • SNAPSHOT - 快照
  • READ COMMITTED SNAPSHOT - 已经提交读隔离

设置整个会话的隔离级别,可以使用以下命令:

SET TRANSACTION ISOLATION LEVEL <isolation name>

设置查询的隔离级别,可以使用以下命令:

SELECT ... FROM <table> WITH (<isolation name>)

不可重复读

按照锁的持有时间来说,在READ COMMITTED隔离级别中,读操作一完成,就立即释放资源上的共享锁。读操作不会在事务持续期间保留共享锁;实际上,甚至在语句结束前也不能一直保留共享锁。这意味着一个事务处理内部对相同数据资源的两个读操作之间,没有共享锁会锁定该资源。因此,其他事务可以在两个读操作之间更改数据资源,读操作因此可能每次得到不同的取值。这种现象称为不可重复读或者不一致分析

如果想保证事务内进行的两个读操作之间,其他任何事务都不能修改由当前事务读取的数据,则需要把隔离级别升级为REPETABLEREAD。这种隔离级别下,事务中的读操作不但需要获得共享锁才能读取数据,而且获得的共享锁将一直保持到事务完成为止。

幻影 幻读

在REPEATABLE READ隔离级别下运行事务,读操作的共享锁将一直保持到事务完成为止,但是事务只锁定第一次运行时找到的那些资源,而不会锁定查询结果范围以外的其他行。因此在同一事务中进行第二次读取之前,如果其他事务插入了新行,而且新行也能满足读操作的查询过滤条件,那么这些新行也会出现在第二次读操作返货的结果中。这些新行称为幻影或者幻读

为了避免幻读,需要将隔离级别设置为更高的SERIALIZABLE。这个隔离会让读操作锁定满足查询搜索条件的整个范围。这意味着读操作不仅锁定了满足查询搜索条件的现有的那些行,还锁定了未来可能满足查询搜索条件的行。更准确的说,如果其他事务视图增加能够满足读操作的行的查询搜索条件的新行,当前事务就会阻塞这样的操作。

posted @ 2012-07-05 15:08  HelloWorld.Michael  阅读(211)  评论(0)    收藏  举报