删除阻止插入
Posted
技术标签:
【中文标题】删除阻止插入【英文标题】:DELETE blocking INSERT 【发布时间】:2012-09-24 07:41:34 【问题描述】:操作系统:Solaris数据库:Informix
我有一个有 2 个线程的进程:
线程 1 处理新事务并执行 DB INSERTS 线程 2 处理现有事务并执行 DB DELETES
问题
线程 1 不断在表上执行 INSERTS(添加新事务)。 线程 2 不断地根据主键从同一个表中执行 DELETES(删除过期事务)
由于页/表锁定而发生的 Informix 错误 244
,INSERTS 失败。
我猜,DELETE 正在执行表锁而不是行锁并阻止插入工作。
有什么办法可以防止这种死锁吗?
编辑
我发现了另一个线索。 244
错误是由 SELECT
查询引起的。
在执行操作之前,insert
和 delete
操作都会从频繁更新的表中执行 select
。
隔离设置为COMMITTED READ
。当我从 dbaccess 手动对这个表执行 select
时,当删除发生时,我得到了同样的错误。
【问题讨论】:
哪个版本的 Informix?表上是否有页锁定或行锁定? DELETE语句的形式是什么? 【参考方案1】:如果在通过主键删除单个元素时 DELETE 正在执行全表锁定,我会感到非常惊讶。相反,由于修改的行数,一个(或两个)事务本身的寿命最终可能会触发表锁。通常,您可以通过消除每个事务中除单行之外的所有操作,并确保您的事务模型是读提交的,来避免此类易失性表中的死锁。至少我的经历是这样的。
【讨论】:
当我在onstat
输出中看到我的进程创建的IX
锁时,我得到了全表锁的线索。我觉得DELETE
会是罪魁祸首。请注意,该线程中发生了许多连续的单行删除。
他们都在同一个事务中?如果是这样,那就是您的自动扶梯。尤其是当它们出现在散布在各处的潜在随机页面上时。是绝对强制的吗?
每个单行删除都在一个事务中。
线程上的缓存(即相同)连接(如果没有别的,我假设是为了性能)?
@cppcoder:单行删除是怎么写的?相关列是否有索引?以上是关于删除阻止插入的主要内容,如果未能解决你的问题,请参考以下文章
如何阻止 Visual Studio 在我的代码中插入不可编辑的空白行