检查从指向 z/OS 上 DB2 数据库实例的两个 DbVisualizer 实例启动的两个事务的行为,我注意到在从表中删除记录期间的以下行为。
假设我有一个MYTABLE
带有主键的表MYID
,并假设执行
select MYID from MYTABLE
给出类似的东西(数字是任意的,写下来只是让事情变得具体)
112
119
...
...
789
...
在试验 A 中,我从第一个事务(使用第一个 DBVisualizer 实例)开始执行,并且没有提交,
DELETE FROM MYTABLE WHERE MYID=112
然后我从第二个事务执行(使用第二个 DBVisualizer 实例)
DELETE FROM MYTABLE WHERE MYID=119
然而,这会阻止第二笔交易,并在一段时间后产生错误
UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT.
REASON CODE 00C9008E, TYPE OF RESOURCE 00000302, AND...
在类似的试验中,试验 B,当我使用MYID
s112
而789
代替(789
是“不靠近” 112
)时,第二笔交易不会阻塞。查找TYPE OF RESOURCE 00000302
一个发现的含义,在https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/db2z_resourcetypes.html,“表空间页面”(链接是针对 DB2在 z/OS 上)。
所以看起来在试验 A中,第一个 DELETE “锁定”了一些“页面”,记录都属于该页面,MYID
112
并且119
该锁定随后阻塞了第二个事务。而在试验 B中,两条记录属于不同的“页面”,第一个 DELETE 不会阻止第二个。
拿一本关于 DB2 的著名书籍,我读到“根据请求的操作,数据库管理器可以获取表行、表块、表、表空间、缓冲池和数据库上的锁”。然后解释存在各种“锁定模式”。
我的问题是:上面引用中的“表块上的锁”是指在试验中观察到的“表空间页上的锁”,还是引用中没有提到的其他锁类型?为什么使用的锁是“表空间页面锁”而不是行级锁,它可能不会导致第二个事务在试验 A期间阻塞?(我读到了 DB2 中的锁升级,但据我所知,当时没有涉及到的事务进行MYTABLE
)
所涉及的 DB2 版本在“兼容模式”下是 10,这会将其降级为类似于 DB2 版本 8。我认为配置应该是“默认”或“标准”。
(这个问题是我努力理解前面问题中描述的问题的结果,一个删除多行的删除语句会导致死锁吗?)
编辑
刚刚在我的 Windows 笔记本上的 DB2 Express 上尝试过,我看到的行为是不同的;正如我所期望的那样,锁是行锁(所以只有当我尝试删除同一行时,第二个 DELETE 才会阻塞)。那么这确实是关于 z/OS 上的 DB2 吗?还是 DB2 的旧版本?或者也许观察暗示了 DB2 的某些特殊配置?