删除阻止插入

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 查询引起的。 在执行操作之前,insertdelete 操作都会从频繁更新的表中执行 select

隔离设置为COMMITTED READ。当我从 dbaccess 手动对这个表执行 select 时,当删除发生时,我得到了同样的错误。

【问题讨论】:

哪个版本的 Informix?表上是否有页锁定或行锁定? DELETE语句的形式是什么? 【参考方案1】:

如果在通过主键删除单个元素时 DELETE 正在执行全表锁定,我会感到非常惊讶。相反,由于修改的行数,一个(或两个)事务本身的寿命最终可能会触发表锁。通常,您可以通过消除每个事务中除单行之外的所有操作,并确保您的事务模型是读提交的,来避免此类易失性表中的死锁。至少我的经历是这样的。

【讨论】:

当我在onstat 输出中看到我的进程创建的IX 锁时,我得到了全表锁的线索。我觉得DELETE 会是罪魁祸首。请注意,该线程中发生了许多连续的单行删除。 他们都在同一个事务中?如果是这样,那就是您的自动扶梯。尤其是当它们出现在散布在各处的潜在随机页面上时。是绝对强制的吗? 每个单行删除都在一个事务中。 线程上的缓存(即相同)连接(如果没有别的,我假设是为了性能)? @cppcoder:单行删除是怎么写的?相关列是否有索引?

以上是关于删除阻止插入的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 Visual Studio 在我的代码中插入不可编辑的空白行

UITextView 阻止苹果的自动更改

外键约束阻止插入

在没有要插入的数据时阻止查询插入

如果它对 xsd 无效,你能阻止节点插入到 XmlDocument 中吗?

tableView beginUpdates / endUpdates 阻止重新加载整个表,即使是空的