DB2并发性和事务隔离级别

1.当事务在多用户环境中没有彼此隔离时,将会产生以下三种后果:
1)脏读

这种情况发生在一个事务读取还未提交的数据时。例如: 事务1改变了一行数据,而在事务1提交修改之前事务2读取了事务1所改变的行的数据。如果事务1回滚了修改,那末事务2就读取了实际上并不存在的数据。
2)不可重复读
这种情况发生在事务两次读取同一行中的数据却得到不同数值时。例如: 事务1读取了一行数据,而事务2改变或删除了那些行并提交了修改。如果事务1再次读取了那一行,那么,事务1就得到了不同的数值(如果那一行被更新)或发现那一行已不存在(如果那一行被删除)。
3)幻影数据
这种情况发生在一行数据满足搜索规则,却在开始没有被看到时。 例如:事务1读取了一系列满足搜索规则的行,而事务2插入了一个满足事务1搜索规则的行。如果事务1再次执行查询语句,就会得到不同的一系列行。
      在允许多个应用程序同时访问同一数据时,应该保持数据库的一致性和数据完整性。这称为“并发”(concurrency)。
DB2使用四个不同的事务隔离级别来实现并发。一个隔离级别决定当数据被访问时,如何锁定数据或让数据与其他进程隔离。DB2支持以下隔离级别:
     ·可重复读
     ·读稳定性
     ·游标稳定性
     ·未提交读

 

2.隔离级别

    与应用程序进程相关联的隔离级别定义了进程与其他并发执行的应用程序进程相隔离的等级。隔离级别被指定为应用程序进程使用的包的属性。(package)是在执行 BIND、PRECOMPILE 或 REBIND 命令期间创建的数据库对象,其中包含 SQL 编译器输出,并用于执行 SQL 语句。在您预编译(准备)应用程序时,或者将应用程序绑定到数据库时,可以指定一个适当的隔离级别。

  • 当应用程序是预编译的(precompiled)时,嵌入式 SQL 语句将会被可以提交给 SQL 编译器的源代码所取代。
  • 当应用程序是被绑定到(bound to)数据库的时候,SQL 编译器输出被转换到一个包中。

DB2 UDB 支持以下隔离级别:

  • 可重复读(Repeatable read,RR) 确保工作单元(UOW)期间的任何表行读操作直到 UOW 完成,不会被其他应用程序进程更改。类似地,由另一个应用程序进程更改的任何行直到由该应用程序进程提交,不会被读取。运行在 RR 级别的应用程序进程是完全与并发应用程序进程的效果相隔离的
  • 读稳定性(Read stability,RS)类似于 RR。但是,运行在 RS 级别的应用程序进程不是 完全与并发应用程序进程的效果相隔离的。如果这样的应用程序进程不止一次发出同样的查询,它就会看到更改了的数据或者由其他应用程序进程添加的新的“幻影(phantom)”行。
  • 游标稳定性(Cursor stability,CS)也确保由另一个应用程序进程更改的任何行直到被那个应用程序进程提交,不会被读取。但是 CS 隔离级别只确保每个可更新游标当前行 不被其他应用程序进程更改;在 UOW 期间读过的行可以被其他应用程序进程更改。
  • 未提交读(Uncommitted read,UR)对于某些操作,允许在 UOW 期间读过的任何行可以被其他应用程序进程更改,并允许读任何被另一个应用程序进程更改过的行,即使该更改还没有提交。对于其他操作,UR 类似于 CS。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章