windy
作者windy·2013-04-10 16:11
数据库管理员·KSRCB

DB2隔离级别

字数 1514阅读 2295评论 0赞 0
并发访问数据出现的情况:
    1.丢失更新:两个事务读取并更新一数据时,其中给一个更新丢失。
    2.脏读:读到未提交的已更改数据。(事务1改变了一行数据,而在事务1提交修改之前事务2读取了事务1所改变的行的数据。如果事务1回滚了修改,那末事务2就读取了实际上并不存在的数据。)
    3.不可重复读:执行两次得到不同的数据。(事务1读取了一行数据,而事务2改变或删除了那些行并提交了修改。如果事务1再次读取了那一行,那么,事务1就得到了不同的数值(如果那一行被更新)或发现那一行已不存在(如果那一行被删除)。)
    4.幻象读:当最初没有看到某个与搜索条件匹配的数据行,而在稍后的读操作中又看到该行时,就会发生这种情况。(事务 1 读取满足某个搜索条件的一组数据行,而事务 2 插入了与事务 1 的搜索条件匹配的新行。如果事务 1 再次执行产生原先行集的查询,就会检索到不同的行集。)
隔离级别:
    1.可重复读(Repeatable Read,RR):
一个事务的影响完全与其他并发事务隔离:脏读、不可重复的读、幻像都不会发生;
锁定该事务所引用的每一行--而不是仅锁定被实际检索或修改的那些行;
不允许其他事务执行会影响这个事务正在访问的任何行的插入、更新或删除操作;
    2.读稳定性(Read Stability,RS):
读稳定性隔离级别可以防止脏读和不可重复的读,但是可能出现幻像;
只锁定事务实际检索和修改的行;
在这个事务存在期间,其他事务不能执行那些会影响这个事务检索到的行集的更新或删除操作;但是其他事务可以执行插入操作。如果插入的行与第一个事务的查询的选择条件匹配,那么这些行可能作为幻像出现在后续产生的结果数据集中。其他事务对其他行所做的更改,在提交之前是不可见的。
    3.游标稳定性(Cursor Stability,CS):
可以防止脏读,但有可能出现不可重复的读和幻像。这是因为在大多数情况下,游标稳定性隔离级别只锁定事务声明并打开的游标当前引用的行;
如果被锁定的行本身不是用索引访问的,那么其他事务可以将新的行添加到表中,以及对被锁定行前后的行进行更新和/或删除操作;
  如果游标重定位,原来行上的锁就被释放,并获得游标现在引用的行上的锁。但是如果事务修改了它检索到的任何行,那么在事务终止之前,其他事务不能更新或删除该行,即使在游标不再位于被修改的行。
其他事务在其他行上进行的更改,这些更改对于使用游标稳定性隔离级别的事务(这是默认的隔离级别)提交之前是不可见的
    4.未提交读(Uncommitted Read,UR):
仅当另一个事务试图删除或更改被检索的行所在的表时,才会锁定一个事务检索的行;
通常用于那些访问只读表和视图的事务,以及某些执行 SELECT 语句的事务(只要其他事务的未提交数据对这些语句没有负面效果)。
选择正确的隔离级别
如果正在执行大型查询,而且不希望并发事务所做的修改导致查询的多次运行返回不同的结果,则使用可重复的读隔离级别。 
如果希望在应用程序之间获得一定的并发性,还希望限定的行在事务执行期间保持稳定,则使用读稳定性隔离级别。 
如果希望获得最大的并发性,同时不希望查询看到未提交的数据,则使用游标稳定性隔离级别。 
如果正在只读的表/视图/数据库上执行查询,或者并不介意查询是否返回未提交的数据,则使用未提交的读隔离级别。 




如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广