解决Oracle SQL中的变异表问题会产生死锁
嘿,我正在尝试在我的Oracle数据库中创建一个触发器,该触发器将更改所有其他记录,但刚刚更改并将触发器启动为0的记录除外。因为我正在更新与启动触发器的表相同的表中的记录,所以我得到了变异表错误。为了解决这个问题,我将代码作为匿名事务,但是这会导致死锁 触发代码:解决Oracle SQL中的变异表问题会产生死锁,sql,triggers,oracle10g,oracle-sqldeveloper,Sql,Triggers,Oracle10g,Oracle Sqldeveloper,嘿,我正在尝试在我的Oracle数据库中创建一个触发器,该触发器将更改所有其他记录,但刚刚更改并将触发器启动为0的记录除外。因为我正在更新与启动触发器的表相同的表中的记录,所以我得到了变异表错误。为了解决这个问题,我将代码作为匿名事务,但是这会导致死锁 触发代码: CREATE OR REPLACE TRIGGER check_thumbnail AFTER INSERT OR UPDATE OF thumbnail ON photograph FOR EACH ROW BEGIN IF :
CREATE OR REPLACE TRIGGER check_thumbnail AFTER INSERT OR UPDATE OF thumbnail ON photograph
FOR EACH ROW
BEGIN
IF :new.thumbnail = 1 THEN
check_thumbnail_set_others(:new.url);
END IF;
END;
程序代码:
CREATE OR REPLACE PROCEDURE check_thumbnail_set_others(p_url IN VARCHAR2)
IS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
UPDATE photograph SET thumbnail = 0 WHERE url <> p_url;
COMMIT;
END;
创建或替换过程检查\u缩略图\u设置\u其他(VARCHAR2中的p\u url)
是PRAGMA自治事务;
开始
更新照片集缩略图=0,其中url p_url;
犯罪
结束;
我假设我造成了一个死锁,因为触发器是在自身内部启动的。有什么想法吗?在这类事情上使用自治事务几乎肯定是一个错误。如果插入新缩略图的事务需要回滚,会发生什么情况?您已经将更改提交到表中的其他行
如果希望数据在事务上保持一致,则需要多个触发器和某种存储状态的方法。最简单的方法是创建一个包含缩略图.url%type集合的包,然后在表上创建三个触发器。before语句触发器将清除集合。行级触发器将:new.url值插入集合。after语句触发器随后将从集合中读取值并调用
检查\u缩略图\u设置\u其他
过程(这不是一个自主事务)。+1这是解决臭名昭著的变异表问题的标准方法。