需要帮助来理解在z / OS上的DB2中的DELETE期间观察到的锁定行为

时间:2017-03-30 21:04:16

标签: concurrency db2 locking db2-zos

检查从两个指向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 112789时,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 112119“属于“,这个锁阻止了第二次交易。在试用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的一些特殊配置?

1 个答案:

答案 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时所看到的差异。