Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 在触发器执行期间保持表的一致性?_Oracle - Fatal编程技术网

Oracle 在触发器执行期间保持表的一致性?

Oracle 在触发器执行期间保持表的一致性?,oracle,Oracle,我有一个触发器,在允许插入一行之前检查另外两个表。但是,在检查其他表和插入行之间,其他表可能会更新 如何确保要检查的表在插入新行之前保持一致状态?我曾考虑解除锁定,但我读到的所有内容都归结为,如果您不将锁定留给Oracle,那么几乎可以肯定您是做错了。Oracle已经为您这样做了,当您执行select时,它将查看事务开始时(第一个DML时)的所有表。但这不会阻止数据在您的权限下被更改,您的事务只是看不到数据被更改。如果您想阻止数据被更改,那么您可以按照Justin Cave的建议使用“选择更新”

我有一个触发器,在允许插入一行之前检查另外两个表。但是,在检查其他表和插入行之间,其他表可能会更新


如何确保要检查的表在插入新行之前保持一致状态?我曾考虑解除锁定,但我读到的所有内容都归结为,如果您不将锁定留给Oracle,那么几乎可以肯定您是做错了。

Oracle已经为您这样做了,当您执行select时,它将查看事务开始时(第一个DML时)的所有表。但这不会阻止数据在您的权限下被更改,您的事务只是看不到数据被更改。如果您想阻止数据被更改,那么您可以按照Justin Cave的建议使用“选择更新”


不过,我会严肃地质疑你在做什么,除了最琐碎的情况外,触发器几乎总是会导致意外的副作用。

你能描述一下你正在做的检查类型吗?根据您正在执行的操作,可以创建强制检查的约束,将检查移动到具有物化视图的提交时间,根据问题的具体情况,通过执行
选择更新
或其他解决方案来序列化事务。如果使用触发器强制执行关系完整性,则也是错误的。业务逻辑也是如此,除了某些非常特殊的情况。与其使用触发器,不如使用标准过程,锁定对底层表的访问。谢谢大家。