最近我和几个客户端项目的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
答案 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