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

Need help to understand locking behaviour observed during DELETE in DB2 on z/OS

检查从指向 z/OS 上的 DB2 数据库实例的两个 DbVisualizer 实例启动的两个事务的行为,我注意到在从 tables 中删除记录期间的以下行为。

假设我有一个 table 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,当我使用 MYIDs 112789 代替时(789是 "not near" 112),第二个事务不会阻塞。查找 TYPE OF RESOURCE 00000302 的含义可以发现,在 https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/db2z_resourcetypes.html 上,"Table space page"(link 用于 z/OS 上的 DB2)。

所以看起来像在试验A中,第一个DELETE "locked" some "page" which both record with MYID 112119 "belonged",然后这个锁阻塞了第二个事务。在 试验 B 中,两条记录属于不同的 "pages" 并且第一个 DELETE 不会阻止第二个。

我阅读了一本关于 DB2 的著名书籍 "Depending on the operations requested, the database manager can acquire locks on table rows, table blocks, tables, table spaces, buffer pools, and databases"。然后说明有各种"locking modes".

我的问题是:上面引文中的"locks on table blocks"是指在试验A"lock on table space pages"中观察到的,还是其他一些锁类型不是引文中提到? 为什么使用的锁是 "table space page lock" 而不是行级锁,行级锁可能不会导致第二个事务在 试验 A 期间阻塞? (我读到过 DB2 中的锁升级,但据我所知当时没有涉及 MYTABLE 的事务)

所涉及的 DB2 版本是 "compatibility mode" 中的 10,这将其降级为 DB2 版本 8。我认为配置应该是 "default" 或 "standard"。

(这个问题是我努力理解之前问题 Can one delete statement which deletes multiple rows cause deadlock? 中描述的问题的结果)

编辑

刚刚在我的 Windows 笔记本上的 DB2 Express 上试过,我看到的行为是不同的;正如我所期望的那样,锁是行锁(因此只有当我尝试删除同一行时,第二个 DELETE 才会阻塞)。那么这确实是关于 z/OS 上的 DB2 的吗?或者它是 DB2 旧版本?或者也许观察暗示了 DB2 的一些特殊配置?

我相信 DB2 z/OS table 空间的默认设置是 LOCKSIZE ANY,这实际上意味着 LOCKSIZE PAGE,即整个 table如果更新该页面上的任何行,则空间页面将被锁定。 Documentation reference。这将解释您所看到的行为。

发布(或要求您的 DBA 发布)ALTER TABLESPACE ... LOCKSIZE ROW 声明 table 空间,其中包含有问题的 table。对于 z/OS 上的 DB2,通常的做法是每个 table 空间有一个 table,因此此更改不会对其他工作负载产生太大影响(除非您设法用完所有锁内存数据库)。

在 DB2 for LUW 中,只有行级和 table 级锁是可能的,因此这也解释了您在 Windows.

上看到的 DB2 Express 的不同之处