1

操作系统:Solaris
数据库:Informix

我有一个有 2 个线程的进程:

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

问题

线程 1 不断在表上执行 INSERTS(添加新事务)。
线程 2 不断地根据主键从同一个表中执行 DELETES(删除过期事务)

244由于页/表锁定而发生的 Informix 错误,INSERTS 失败。

我猜,DELETE 是在做一个表锁而不是行锁,并阻止插入工作。

有什么办法可以防止这种死锁吗?


编辑

我发现了另一个线索。该244错误是由SELECT查询引起的。在执行操作之前,and
操作都会从频繁更新的表中执行一次。insertdeleteselect

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

4

1 回答 1

1

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

于 2012-09-24T08:00:40.027 回答