DB2并发异常和隔离级

 在任何数据库环境中,数据完整性都是人们最关心的事情。当数据被修改(包括插入和删除)时,数据库服务器必须保证数据的完整性。执行的每条可执行SQL语句都是事务的一部分。一个事务将至少包含一条SQL语句。多条SQL语句可以组合在一起作为单个事务执行。

事务中出现的一些并发异常

● 丢失更新(Lost Update)
● 未提交读(Uncommitted read)
● 不可重复读(Nonrepeatable read)
● 幻象读(Phantom read)

未提交读(UR)隔离级也称为“脏读”,它可以用来存取其它应用程序的未提交的数据更新。

不可重复读是指在同一事务中,两次执行同样的SELECT语句,得到的结果集不同。非提交读应用程序不能保证可重复读。为了避免这种类型的不可重复读,所有被查询的数据都应被锁定。假如用户希望被查询的数据不被修改,仅需将这些数据锁定就行了。DB2中,这称为读稳定性(read stability)。假如用户希望所查询的数据在该事务中不再被更改,即可重复读(repeatable read),这就需要附加的锁定。

假如应用程序将同一查询执行两次,将可能出现幻象读现象。第二次发出同一查询时,返回结果可能新增了一些行。对于多数应用程序,这是一个可以接受的方案。例如,查询涉及寻找音乐会的所有空余座位,则重复发出该查询并获得一个较好的座位选择就是一个满足需求的特点。根据不同的情况,有时可能需要幻象读。假如用户希望避免幻象读,应用程序必需锁定全部可能限定的行。这将确保没有其它应用程序能够更新、删除或插入可能会影响结果表的行。


隔离级(Isolation Levels)

DB2通用数据库提供了不同的保护级别,将每一个数据库应用程序与被存取的数据隔离开来。这些不同的保护级别即为不同的隔离级或锁定策略。

DB2支持的隔离级包括:

● 非提交读(Uncommitted read)
● 游标稳定性(Cursor stability)
● 读稳定性(Read stability)
● 可重复读(Repeatable read)

  将包绑定到数据库时,可以使用PREP或BIND命令的ISOLATION选项,定义嵌入式SQL的隔离级。假如没有指定隔离级,则采用游标稳定性的默认隔离级。


未提交读(UR)隔离级也称为“脏读”,是DB2支持的最低级别的隔离级。它可以用来存取其它应用程序的未提交的数据更新。例如,使用未提交读隔离级的应用程序将返回查询的所有匹配行,即使该数据处于被更新的过程之中,并没有向数据库进行提交。
假如用户决定使用这一隔离级,用户的应用程序可能存取不正确的数据。未提交读事务持有的锁很少。当使用这种隔离级时,可能出现不可重复读和幻象读现象。


游标稳定性(CS,或称光标稳定性)隔离级锁定工作单元期间光标所在的任何行。对该行的锁定将保持到取出下一行记录或整个工作单元终止。假如更新某一行,该锁将保持到整个工作单元终止。当执行COMMIT或ROLLBACK语句时,该工作单元就终止了。
使用游标稳定性的应用程序不能读未提交数据。另外,应用程序锁定当前被取出的行,其它的应用程序都不能修改当前行的内容。
假如用户决定使用这一隔离级,用户的应用程序读取的数据将保持一致性,但不可重复读或幻象读状况仍可能存在。


读稳定性(RS)隔离级锁定作为结果表中的那一部分行。假如用户有一张包含10000行记录的表,查询结果返回10行记录,则仅有10条记录被锁定。
使用读稳定性的应用程序不能读未提交的数据。使用这种隔离级并不是仅有一行被锁定,而是一个事务中所有被读取的行都会被锁定。其它的任何应用程序都不能修改这些行。
 假如用户决定使用这一隔离级,则在同一执行单元中多次执行同一查询时,用户的应用程序得到相同的结果。这样可以保证在一个事务中即使多次读取同一行,得到的值不会改变,但读稳定性隔离级不能阻止通过插入操作在结果集中加入新行,即得到新增的幻象行。


可重复读(RR)隔离级是DB2中最高级别的隔离级,使用这种隔离级,不仅满足读取条件的行被锁定,应用程序在工作单元内所引用的所有行也将被锁定。无论结果集有多大,构造这个结果集所处理的所有行都持有该锁。表锁可以用来代替大量的因子锁(factor)。


选择合适的隔离级是很重要的,因为它不仅影响并发性,而且影响到应用软件的性能。用户的保护越多(使用的隔离级别越高),并发性就越低。
用户决定在应用程序中哪些并发问题是无法接受的,就选择能防止该问题出现的那种隔离级别:

  当用户在只读型表上使用查询,或者仅使用SELECT语句,而并不在意是否从并发应用中获取了未提交数据时,则应使用未提交读隔离级。

  当用户需要获得最大的并发度,同时又只要见到并发应用的已被提交的数据,则应使用游标稳定性隔离级。

  当用户的应用程序在并发环境中操作时,则应使用读稳定性隔离级。这意味着在整个工作单元工作期间,被限定的行需要保持稳定。

  假如用户需要在同一事务中结果集不发生改变,则需要使用可重复读隔离级。

  使用可重复读隔离级的应用程序无法读取并发应用中的未提交的数据。假如用户决定采用这种隔离级,那么用户的应用中就不会出现前面所讨论的各种问题(丢失更新、幻象读或不可重复读)。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值