检查从两个指向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
s 112
和789
时,789
“不在附近” 112
),第二个事务不会阻止。查找TYPE OF RESOURCE 00000302
的含义,在https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/db2z_resourcetypes.html上找到“表空间页面”(该链接用于z / OS上的DB2)。
所以在试用A 中看来,第一个DELETE“锁定”了一些“页面”,两个记录都与MYID
112
和119
“属于“,这个锁阻止了第二次交易。在试用B 时,两个记录属于不同的“页面”,第一个DELETE不会阻止第二个。
关于DB2的一本着名的书我读过“根据所请求的操作,数据库管理器可以获取表行,表块,表,表空间,缓冲池和数据库的锁”。然后解释说有各种“锁定模式”。
我的问题是:上面引文中的“锁定表块”是指在试用A “锁定表空间页面”中观察到的,或者是其他一些未提及的锁定类型引用?
为什么使用的锁是“表空间页锁”而不是行级锁定,这可能不会导致第二个事务在试用A 期间阻塞?
(我在DB2中读到了关于锁升级的内容,但据我所知,当时没有涉及MYTABLE
的事务处理
所涉及的DB2版本在“兼容模式”中是10,它将其降级为类似DB2版本8.我认为配置应该是“默认”或“标准”。
(这个问题是我努力理解早期问题Can one delete statement which deletes multiple rows cause deadlock?中描述的问题的结果)
修改
刚刚在我的Windows笔记本上试过DB2 Express,我看到的行为是不同的;锁是行锁,就像我期望的那样(所以只有当我尝试删除同一行时,第二个DELETE才会阻塞)。这是关于z / OS上的DB2的吗?或者它是DB2旧版本?或者观察结果暗示了DB2的一些特殊配置?
答案 0 :(得分:2)
我认为DB2 z / OS表空间的默认设置是LOCKSIZE ANY
,这实际上意味着LOCKSIZE PAGE
,也就是说,如果更新该页面上的任何行,则会锁定整个表空间页面。 Documentation reference。这可以解释你所看到的行为。
问题(或要求您的DBA发布)一个ALTER TABLESPACE ... LOCKSIZE ROW
语句,用于保存相关表的表空间。对于z / OS上的DB2,通常的做法是每个表空间有一个表,因此这种更改不应对其他工作负载产生太大影响(除非您设法耗尽数据库中的所有锁内存)。
在DB2 for LUW中,只能进行行级和表级锁定,因此这也解释了您在Windows上使用DB2 Express时所看到的差异。