0

最近我与几个客户项目的 Firebird 服务器打架。我可以避免在我的编程环境中出现死锁问题,但我想在触发器中做一些工作。感谢我从 StackOverflow 获得的建议,我真的很接近我的目标,但我找不到有关在触发器中捕获死锁的信息,等到它解锁并继续触发过程。有人可以给我链接或建议如何面对它吗?

带有更新或插入的简单触发器定义:

CREATE TRIGGER XYZ FOR TABLE_X ACTIVE AFTER UPDATE POSITION 0 AS
begin
    UPDATE TABLE_X SET FIELD = 1 where contidion
end

当我要更改的行被其他进程锁定时,如何避免问题?

问候, 阿蒂克

4

1 回答 1

1

在您的评论中,您说您要更新触发器触发的同一行,在这种情况下不会发生死锁,因为当前事务已经在该行上具有“锁定”,因此允许再次修改它。但是,您的方法是错误的。如果要修改触发器触发的同一行的内容,则不应使用触发器AFTER UPDATE,而应使用BEFORE UPDATE触发器并使用NEW触发器上下文变量来更新一个或多个列。

所以你的触发器应该是这样的:

CREATE TRIGGER XYZ FOR TABLE_X ACTIVE BEFORE UPDATE POSITION 0 AS
begin
    IF condition THEN
       NEW.FIELD = 1;
end
于 2013-02-01T09:35:23.650 回答