DB2锁问题分析与解释(4)

来源:未知 责任编辑:责任编辑 发表时间:2015-03-01 01:41 点击:

$ db2 +c "update student set name='hehe' where age = 4"
DB20000I The SQL command completed successfully.


session 2
---------
$ db2 +c "delete from student where age=6" <--没有发生锁等待现象,直接成功
DB20000I The SQL command completed successfully.


可以看到,已经通过索引解决了该锁超时问题,如果读者有兴趣的话,可以看下建立索引之后的访问计划。






下面模拟一个死锁现象
试验5:模拟死锁,过程如下
第一步:session 1 获得 锁 LOCK1


第二步:session 2 获得 锁 LOCK2


第三步:session 2 申请 锁 LOCK1


第四步:session 1 申请 锁 LOCK2


为了避免死锁之前产生锁超时,先将锁超时控制参数设为-1(表示永远等待)
update db cfg using locktimeout -1
之后重启数据库


session 1
---------
$ db2 +c "update student set name = 'an' where age = 1" <--获得锁LOCK1,成功
DB20000I The SQL command completed successfully.


session 2
---------
$ db2 +c "update student set name = 'two' where age = 4" <--获得锁LOCK2,成功
DB20000I The SQL command completed successfully.


$ db2 +c "update student set name = 'four' where age = 1" <--申请锁LOCK1,hang住,因为LOCK1被session 1持有


session 1
---------
$ db2 +c "update student set name = 'three' where age = 4" <--申请锁LOCK2,hang住,因为LOCK2被session 2持有




这时已经发生了死锁,10s之后,这两个session有一个会报出如下死锁(reason code 2)错误,另一个session成功执行
SQL0911N The current transaction has been rolled back because of a deadlock
or timeout. Reason code "2". SQLSTATE=40001


参考资料:
标准表的锁定方式和存取方案,这里您可以看到详细的加锁方式
http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.perf.doc/doc/r0005275.html?lang=zh


附,只能在发生死锁或者锁等待的时候才能用db2pd查看锁的信息。下面附上如何采用事件监控器监控死锁/锁超时。事件监控器可以抓取一段时间内的锁事件
db2 update db cfg for sample using MON_LOCKWAIT hist_and_values MON_DEADLOCK hist_and_values MON_LOCKTIMEOUT hist_and_values MON_LW_THRESH 10000
db2 "CREATE EVENT MONITOR LOCKEVMON FOR LOCKING WRITE TO UNFORMATTED EVENT TABLE (TABLE LOCKEVMON)"
db2 set event monitor LOCKEVMON state=1


重现问题


db2 flush event monitor LOCKEVMON
db2 set event monitor LOCKEVMON state=0


cp /home/db2users/e97q6c/sqllib/samples/java/jdbc/db2evmonfmt.java ./
cp /home/db2users/e97q6c/sqllib/samples/java/jdbc/DB2EvmonLocking.xsl ./
export PATH=/home/db2users/e97q6c/sqllib/java/jdk64/bin:$PATH


javac db2evmonfmt.java


java db2evmonfmt -d qsmiao -ue LOCKEVMON -ftext -u e97q6c -p e97q6c > deadlock.txt
more deadlock.txt 可以看到有关的SQL语句。




请参考
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1004lockeventmonitor/
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • DB2 · CREATE TABLESPACE
  • DB2数据库的导出与导入(Windows客户端)
  • DB2查看表结构及所用表语句
  • db2 CLP中如何换行
  • db2管理工具小结
  • 使用DB2对象:创建模式、表和视图
  • DB2数据库逻辑卷的复制
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索 - 移动版 - 返回顶部
Copyright © 2008-2013 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1