锁具模式和锁具兼容性

的模式决定了锁的所有者和任何并发进程对锁定的对象拥有何种访问权限。

开始特定程序编程接口信息。Db2 使用锁模式来确定一个锁是否与另一个锁兼容。 某些锁定模式不排除其他用户。 例如,假设应用程序A锁定了B也想访问的表空间。 Db2 代表流程B请求锁定某种特定模式。 如果流程A的锁模式允许流程B要求的锁,则称这两个锁的模式是兼容的。 然而,如果两个锁不兼容,则无法进行B流程。 它必须等到流程A释放其锁,以及所有其他现有的不兼容锁被释放。

页面和行锁定模式

这些模式及其影响按照对资源控制的增加顺序排列。

S锁(共享)
锁定页面的所有者以及任何并发进程都可以读取但无法更改被锁定的页面或行。 并发进程可以在页面或行上获取S或U锁,也可以在不获取页面或行锁的情况下读取数据。 只能同时购买一把U型锁和一把或多把S型锁。
U型锁(更新)
锁的拥有者可以阅读,但不能更改被锁定的页面或行。 并发进程可以获得S锁,也可以在不获得页面或行锁的情况下读取数据,但任何并发进程都无法获得U锁。

当锁的主人正在阅读一页或一行以决定是否更改时,U型锁可以减少出现死锁的可能性。 主人可以从U型锁开始,然后升级到X型锁,以改变页面或行。

X锁(独家)
锁的拥有者可以阅读或更改被锁定的页面或行。 并发进程不能在页面或行上获取S、U或X锁。 然而,并发进程(例如与 CURRENTDATA(NO) 或 ISOLATION(UR) 绑定选项绑定或使用为 EVALUNC 子系统参数指定的 YES 运行的进程)可以在不获取页面或行锁的情况下读取数据。

分区、桌面空间和桌面锁定模式

当页面或行被锁定时,包含该页面或行的表格、分区或表格空间也会被锁定。 此意图锁表示应用程序访问数据的计划。 在这种情况下,桌子、隔断或桌子空间锁具有以下意向模式之一:IS代表意向共享 ,IX代表意向独占 ,SIX代表意向共享和意向独占

桌子、隔板和桌面空间锁的S、U和X模式有时被称为粗锁模式。 在阅读方面,SIX是一种粗略的模式锁定,因为您无法锁定页面或行;从这个意义上讲,它就像一个S锁。

这些模式及其影响按照对资源控制的增加顺序排列。

IS锁(意图共享)
锁所有者可以读取表、分区或表空间中的数据,但不能更改。 并发进程可以同时读取和更改数据。 锁所有者可能会对读取的任何数据获取页锁或行锁。
IX锁(仅限有意者)
锁的所有者和并发进程可以读取和更改表、分区或表空间中的数据。 锁所有者可能会对读取的任何数据获取页锁或行锁;它必须对更改的任何数据获取页锁或行锁。
S锁(共享)
锁的所有者和任何并发进程都可以读取,但不能更改表、分区或表空间中的数据。 锁所有者读取数据时不需要页锁或行锁。
U型锁(更新)
锁的主人可以读取但无法更改被锁定的数据;不过,主人可以将锁升级为X锁,然后更改数据。 与U锁同时进行的进程可以获取S锁并读取数据,但任何进程都无法同时获取U锁。 锁所有者不需要页锁或行锁。

U型锁可减少锁主读取数据以决定是否更改时出现死锁的几率。 当锁的大小为表空间,且语句为带有FOR UPDATE子句的SELECT时,U锁在表空间上获得。 同样,当锁的大小为TABLE,且语句为带有FOR UPDATE子句的SELECT时,U锁在表上获取。

六锁(共享,意图独占)
锁所有者可以读取和更改表、分区或表空间中的数据。 并发进程可以读取表、分区或表空间中的数据,但不能更改数据。 只有当锁所有者更改数据时,才会获取页锁或行锁。
X锁(独家)
锁所有者可以读取或更改表、分区或表空间中的数据。 如果进程以UR隔离运行,或者分区表空间中的数据以CS隔离和CURRENTDATA((NO)运行,则并发进程可以访问数据。 锁所有者不需要页锁或行锁。

例如,一条SQL语句在客户数据表中找到约翰·史密斯,并更改了他的地址。 该语句将整个表格空间锁定在模式IX中,并将更改的特定行锁定在模式X中。

锁止模式的兼容性

下表显示了页面和行锁定的任意两种模式的兼容性。 页面锁和行锁之间不存在兼容性问题,因为分区或表空间不能同时使用页面锁和行锁。

表 1. 页面锁定和行锁定模式的兼容性矩阵
锁定方式 分享(S锁) 更新(U型锁) 独家(X锁)
分享(S锁) False
更新(U型锁) False False
独家(X锁) False False False

与页面和行锁相比,表格空间锁的兼容性要复杂一些。 下表显示了分区、桌面空间或桌面锁的任意两种锁定模式的兼容性。


表 2. 桌子和桌子空间(或隔板)锁定模式的兼容性
锁定方式 IS IX S U SIX X
IS False
IX False False False False
S False False False
U False False False False
SIX False False False False False
X False False False False False False

结束特定程序编程接口信息。