Database 为什么在表上使用锁定模式页

Database 为什么在表上使用锁定模式页,database,locking,deadlock,informix,Database,Locking,Deadlock,Informix,我想知道为什么我需要在表上使用锁定模式页面 最近我想出了一个很好的例子来解释为什么不。当我试图在表中插入一行时,出现了死锁。经过大量调查,我发现表的锁级别是Page,这是导致死锁的实际原因 我猜这是大规模高性能环境中的常见场景,多个应用程序访问同一个数据库 我发现的唯一一件事是,如果我以与分页相同的顺序处理行,那么应该使用页面锁定。这看起来像是一个很少能满足的弱条件(特别是对于可能使这种情况过时的缩放) 我可以理解为什么会锁定一个完整的表或使用每行锁定,但页面锁定没有多大意义。或者是吗?您永远不

我想知道为什么我需要在表上使用锁定模式页面

最近我想出了一个很好的例子来解释为什么不。当我试图在表中插入一行时,出现了死锁。经过大量调查,我发现表的锁级别是Page,这是导致死锁的实际原因

我猜这是大规模高性能环境中的常见场景,多个应用程序访问同一个数据库

我发现的唯一一件事是,如果我以与分页相同的顺序处理行,那么应该使用页面锁定。这看起来像是一个很少能满足的弱条件(特别是对于可能使这种情况过时的缩放)

我可以理解为什么会锁定一个完整的表或使用每行锁定,但页面锁定没有多大意义。或者是吗?

您永远不需要在表上使用锁定模式页面,但您可以选择这样做

如果一个页面上只有一行(或者一行需要多个页面),那么它不会造成任何损害

不过,如果您可以在一个页面上容纳多行,则在锁定模式页面和锁定模式行之间有一个有意义的选择。显然,如果您使用锁模式行,那么一个进程在页面的一行上有锁这一事实不会阻止另一个进程在同一页面的另一行上获得锁,而锁模式页面会阻止这一点

锁定模式页面的优点是,当单个进程在单个事务中更新页面上的多行时,它需要更少的锁定

所以,你必须做一个平衡的动作。您可以认为数据库中有太多的行,以至于两个进程需要在同一页上锁定不同行的可能性可以忽略不计,并且使用锁定模式页面时,您会知道,如果使用锁定模式行,进程将阻塞其他不会被阻塞的进程的风险很小。或者,您可以认为这种阻塞的风险是不可接受的,并且锁的数量增加不是问题,并且决定使用锁模式行

从历史上看,当锁的数量是一个问题,因为内存不足时(在大型计算机的主内存不足100 MiB的时代!),使用锁模式页面保存锁比现在系统的主内存为多GB时更有意义

请注意,如果两个进程要更新同一行,则使用哪种锁定模式并不重要;其中一个将获得锁并阻止另一个,直到事务提交(或者如果不使用显式事务,则直到语句完成)

请注意,默认的锁定模式仍然是锁定模式页面,这主要与历史记录不同,历史记录一直都是这样。但是,有一个ONCONFIG参数DEF_TABLE_LOCKMODE,您可以将其设置为
(而不是
),它将默认的表锁定模式设置为锁定模式行。您仍然可以在DDL语句中显式重写该选项,但如果未指定显式锁定模式,则默认值将是
,具体取决于DEF_TABLE_LOCKMODE的设置。

您不需要在表上使用锁定模式页,但您可以选择这样做

如果一个页面上只有一行(或者一行需要多个页面),那么它不会造成任何损害

不过,如果您可以在一个页面上容纳多行,则在锁定模式页面和锁定模式行之间有一个有意义的选择。显然,如果您使用锁模式行,那么一个进程在页面的一行上有锁这一事实不会阻止另一个进程在同一页面的另一行上获得锁,而锁模式页面会阻止这一点

锁定模式页面的优点是,当单个进程在单个事务中更新页面上的多行时,它需要更少的锁定

所以,你必须做一个平衡的动作。您可以认为数据库中有太多的行,以至于两个进程需要在同一页上锁定不同行的可能性可以忽略不计,并且使用锁定模式页面时,您会知道,如果使用锁定模式行,进程将阻塞其他不会被阻塞的进程的风险很小。或者,您可以认为这种阻塞的风险是不可接受的,并且锁的数量增加不是问题,并且决定使用锁模式行

从历史上看,当锁的数量是一个问题,因为内存不足时(在大型计算机的主内存不足100 MiB的时代!),使用锁模式页面保存锁比现在系统的主内存为多GB时更有意义

请注意,如果两个进程要更新同一行,则使用哪种锁定模式并不重要;其中一个将获得锁并阻止另一个,直到事务提交(或者如果不使用显式事务,则直到语句完成)

请注意,默认的锁定模式仍然是锁定模式页面,这主要与历史记录不同,历史记录一直都是这样。但是,有一个ONCONFIG参数DEF_TABLE_LOCKMODE,您可以将其设置为
(而不是
),它将默认的表锁定模式设置为锁定模式行。您仍然可以在DDL语句中显式重写该选项,但如果未指定显式锁定模式,则默认值将是
,具体取决于DEF_TABLE_LOCKMODE的设置。

您不需要在表上使用锁定模式页,但您可以选择这样做

如果一个页面上只有一行(或者一行需要多个页面),那么它不会造成任何损害

不过,如果您可以在一个页面上容纳多行,则在锁定模式页面和锁定模式行之间有一个有意义的选择。显然,如果您使用锁模式行,那么一个进程在页面的一行上有一个锁这一事实不会阻止另一个进程