DELETE阻止INSERT

时间:2012-09-24 07:41:35

标签: c++ sql multithreading deadlock informix

操作系统:Solaris
数据库:Informix

我有一个包含2个主题的进程:

线程1处理新事务并执行DB INSERTS
线程2处理现有事务并执行DB DELETES

问题

线程1在表格上持续进行INSERTS(添加新交易) 线程2持续根据主键

从同一个表中执行DELETES(删除过期的事务) 由于页面/表锁定导致Informix错误244,因此INSERTS失败。

我猜,DELETE正在执行表锁而不是行锁并阻止INSERT工作。

有什么办法可以防止这种僵局吗?


编辑

我找到了另一条线索。 244错误是由SELECT查询引起的 在执行操作之前,insertdelete操作都会从频繁更新的表中执行select

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

1 个答案:

答案 0 :(得分:1)

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