火鸟,锁定内触发器

时间:2013-02-01 08:47:52

标签: triggers deadlock firebird

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

带有更新或插入内部的Siple触发器定义:

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

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

此致 ARTIK

1 个答案:

答案 0 :(得分:1)

在你的评论中你说你要更新触发器触发的同一行,在这种情况下不会发生死锁,因为当前事务已经在行上有'lock',所以允许再次修改它。但是你的方法是错的。如果您想要修改触发器触发的同一行的内容,您应该使用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