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/
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>