Concurrency 需要帮助了解在z/OS上的DB2中删除期间观察到的锁定行为吗

Concurrency 需要帮助了解在z/OS上的DB2中删除期间观察到的锁定行为吗,concurrency,db2,locking,db2-zos,Concurrency,Db2,Locking,Db2 Zos,通过检查从指向z/OS上DB2数据库实例的两个DbVisualizer实例启动的两个事务的行为,我注意到在从表中删除记录期间的以下行为 假设我有一个表MYTABLE,主键为MYID,假设 从MYTABLE中选择MYID 给出类似(数字是任意的,写下来只是为了让事情具体化) 在试用版A中,我从第一个事务(使用第一个DBVisualizer实例)执行,但不提交 DELETE FROM MYTABLE WHERE MYID=112 然后从第二个事务执行(使用第二个DBVisualizer实例) 但是

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

假设我有一个表
MYTABLE
,主键为
MYID
,假设

从MYTABLE中选择MYID

给出类似(数字是任意的,写下来只是为了让事情具体化)

试用版A中,我从第一个事务(使用第一个DBVisualizer实例)执行,但不提交

DELETE FROM MYTABLE WHERE MYID=112
然后从第二个事务执行(使用第二个DBVisualizer实例)

但是,这会阻止第二个事务,并在一段时间后产生错误

UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. 
REASON CODE 00C9008E, TYPE OF RESOURCE 00000302, AND...
在类似的试验中,试验B,当我使用
MYID
s
112
789
代替(
789
不在
112
附近)时,第二个事务不会阻塞。查找资源00000302的
类型的含义可以在“表空间页”(该链接适用于z/OS上的DB2)上找到

因此,在试用版A中,第一次删除“锁定”了某个“页面”,而
MYID
112
119
“属于该页面”,并且该锁定阻止了第二次交易。而在试验B中,两条记录属于不同的“页面”,第一次删除不会阻止第二次删除

拿一本关于DB2的著名书籍来说,我读到“根据请求的操作,数据库管理器可以获取表行、表块、表、表空间、缓冲池和数据库上的锁”。然后说明存在各种“锁定模式”

我的问题是:上述引文中的“表块锁定”是指试验A中观察到的“表空间页面锁定”,还是引文中未提及的其他锁定类型? 为什么使用的锁是“表空间页锁”,而不是行级锁,这可能不会导致第二个事务在试用A期间阻塞? (我读过DB2中的锁升级,但据我所知,当时没有涉及
MYTABLE
的事务)

所涉及的DB2版本是处于“兼容性模式”的10,这将其降级为类似于DB2版本8的版本。我认为配置应该是“默认”或“标准”

(这个问题是我努力理解前面问题中描述的问题的结果)

编辑


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

我认为DB2 z/OS表空间的默认设置是
LOCKSIZE ANY
,这实际上意味着
LOCKSIZE PAGE
,也就是说,如果页面上的任何行被更新,整个表空间页面都会被锁定。这可以解释你看到的行为

发布(或要求DBA发布)一个
altertablespace。。。LOCKSIZE ROW
语句,用于保存相关表的表空间。对于z/OS上的DB2,通常的做法是每个表空间有一个表,因此此更改不会对其他工作负载产生太大影响(除非您设法耗尽数据库中的所有锁内存)


在DB2forLUW中,只有行级和表级锁是可能的,因此这也解释了您在Windows上看到的与DB2Express的差异。

我认为DB2z/OS表空间的默认设置是
locksizeany
,这实际上意味着
LOCKSIZE PAGE
,也就是说,如果页面上的任何行被更新,则整个表空间页面将被锁定。这可以解释你看到的行为

发布(或要求DBA发布)一个
altertablespace。。。LOCKSIZE ROW
语句,用于保存相关表的表空间。对于z/OS上的DB2,通常的做法是每个表空间有一个表,因此此更改不会对其他工作负载产生太大影响(除非您设法耗尽数据库中的所有锁内存)

在DB2forLUW中,只有行级和表级锁是可能的,因此这也解释了您在Windows上看到的DB2Express的差异

DELETE FROM MYTABLE WHERE MYID=119 
UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. 
REASON CODE 00C9008E, TYPE OF RESOURCE 00000302, AND...