我的应用程序中有4个不同的服务,SELECT
和UPDATE
位于AIX 6.1上的数据库(db2 v9.1)中的同一个表上,而不是300,000个记录中的大表.4个服务工作以并行方式执行,每个服务按顺序执行(不是并行)。
每天我遇到可怕的死锁问题,db挂起大约5到10分钟,然后它恢复到正常的性能。
我的服务是以一种方式同步的,这使得它们在同一行上永远不会SELECT
或UPDATE
所以我相信即使发生了死锁,它应该在行级别而不是表级别,对吗?
此外,在我的SELECT
查询中,我使用"ONLY FOR FETCH WITH UR"
,在db2 v9.1中,这意味着不将该行仅作为读取目的锁定,并且不会更新(UR
=未提交读)。
关于什么事发生的想法和原因?
答案 0 :(得分:0)
首先,这些肯定不是死锁:DB2会在几秒钟内通过回滚其中一个冲突的事务来解决死锁。您遇到的情况很可能是锁定等待。
至于发生了什么,您需要在锁定发生时对其进行监控。您可以使用db2pd
实用程序,例如
db2pd -d mydb -locks showlocks
或
db2pd -d mydb -locks wait
您也可以使用快照监视器:
db2 update monitor switches using statement on lock on
db2 get snapshot for locks on mydb
或快照视图:
select * from sysibmadm.locks_held
select * from sysibmadm.lockwaits