Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解决Oracle SQL中的变异表问题会产生死锁_Sql_Triggers_Oracle10g_Oracle Sqldeveloper - Fatal编程技术网

解决Oracle SQL中的变异表问题会产生死锁

解决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 :

嘿,我正在尝试在我的Oracle数据库中创建一个触发器,该触发器将更改所有其他记录,但刚刚更改并将触发器启动为0的记录除外。因为我正在更新与启动触发器的表相同的表中的记录,所以我得到了变异表错误。为了解决这个问题,我将代码作为匿名事务,但是这会导致死锁

触发代码:

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这是解决臭名昭著的变异表问题的标准方法。