您好,欢迎访问一九零五行业门户网

DB2中三个有关锁变量DB2_EVALUNCOMMITTED,DB2_SKIPDELETED和DB2

本文主要解释下db2中三个有关锁变量db2_evaluncommitted,db2_skipdeleted和db2_skipinserted的使用 实验环境: db2 v9.7.0.6 aix 6.1.0.0 采用默认的隔离级别cs student表的ddl与初始内容 create table e97q6c .student ( age integer , name char(8) ) in
本文主要解释下db2中三个有关锁变量db2_evaluncommitted,db2_skipdeleted和db2_skipinserted的使用
实验环境:
db2 v9.7.0.6
aix 6.1.0.0
采用默认的隔离级别cs
student表的ddl与初始内容
create table e97q6c .student (
age integer ,
name char(8) )
in userspace1 ;
$ db2 select * from student
age name
----------- --------
3 xu
5 gao
6 mu
6 mu
6 mu
4 three
1 an
7 record(s) selected.
--分割线--
当启用db2_evaluncommitted时,db2可以对未提交的插入(insert)或更新(update)数据进行谓词判断。
如果未提交的数据不符合该条语句的谓词判断条件,db2将不对未提交数据加锁,这样避免了因为要对
未提交数据加锁引起的锁等待状态,提高了应用程序访问的并发性。
实验 1
测试如下(该参数与数据库配置参数cur_commit有冲突,因此,测试之前需要先将cur_commit参数设为disabled.)
首先在session 1里做一条“未提交的插入(insert)操作”
session 1
---------
$ db2 +c insert into student values(7,'he')
db20000i the sql command completed successfully.
session 2
---------
$ db2 select * from student
sql0911n the current transaction has been rolled back because of a deadlock
or timeout. reason code 68. sqlstate=40001
$ db2 select * from student where age = 3
sql0911n the current transaction has been rolled back because of a deadlock
or timeout. reason code 68. sqlstate=40001
可以看到,在session 2里的两条语句都因锁超时而失败了。原因是如果用户在更改(update)、插入(insert)或
删除(delete)一行时,会在这一行加上排它锁,别的用户不能读、写,除非使用ur隔离级别。
现在启用db2_evaluncommitted变量,需要重启实例,之后在session 1里做同样的插入操作,session 2里做同样的查询
操作:
session 1
------------
$ db2set db2_evaluncommitted=on
$ db2stop force
$ db2start
$ db2 connect to qsmiao
$ db2 +c insert into student values(7,'he')
db20000i the sql command completed successfully.
session 2
------------
$ db2 select * from student
sql0911n the current transaction has been rolled back because of a deadlock
or timeout. reason code 68. sqlstate=40001
$ db2 select * from student where age = 3
age name
----------- --------
3 xu
1 record(s) selected.
这次可以看到第2条查询语句是成功的,原因是session 1中有未提交的插入操作,session 2在扫描时,对该行进行了谓词判断,发现不符合谓词盼断条件
也就是 age = 3 , session 2就不会对该行进行加锁,因而不会导致锁超时。
db2_skipdeleted变量被启用的效果是:在表访问期间,会无条件地跳过被删除的行。
实验 2:
在默认情况下,即没有设置db2_evaluncommitted和db2_skipdeleted变量的时候,如果session 1用提交的方式删除操作的时候,session 2若要查询整个表,是要超时的,
如下:
session 1
---------
$ db2set db2_skipdeleted=off
$ db2set db2_evaluncommitted=off
$ db2stop force
$ db2start
$ db2 connect to qsmiao
$ db2 +c delete from student where age=6
db20000i the sql command completed successfully.
session 2
---------
$ db2 select * from student
sql0911n the current transaction has been rolled back because of a deadlock
or timeout. reason code 68. sqlstate=40001
如下,现在修改db2_skipdeleted为on,那么session 2查询的时候,会无条件地跳过被删除的行,因此会成功。
session 1
---------
$ db2 rollback
$ db2set db2_skipdeleted=on
$ db2stop force
$ db2start
$ db2 connect to qsmiao
$ db2 +c delete from student where age=6
db20000i the sql command completed successfully.
session 2
---------
$ db2 select * from student
age name
----------- --------
3 xu
5 gao
4 three
1 an
4 record(s) selected.
类似的,db2_skipinserted变量的作用是无条件地跳过被插入的行,就像它们还没有被插入。
参考资料:
牛新庄 《高级进阶db2(第2版)》
其它类似信息

推荐信息