同一交易中的数据一致性

时间:2015-04-13 13:29:19

标签: oracle

任何人都可以帮助解决以下问题。 提前谢谢。

我正在为Id 100更新表ACC_STATUS

状态列的当前值为0.

UPDATE ACC_STATUS
SET STATUS = 1
WHERE ID = 100;

更新后,我正在调用一个程序pro_do_other_things,它位于另一个架构中。

此过程中有一个来自表ACC_STATUS的SELECT - pro_do_other_things。结果始终未显示更新的值。在某些情况下,它会显示新更新值以及其他一些旧值。

请注意,更新声明和程序调用都发生在以下相同的交易中。

BEGIN

   UPDATE ACC_STATUS
   SET STATUS = 1
   WHERE ID = 100;

   OTHER_SCHEMA.pro_do_other_things;

 COMMIT;

EXCEPTION
WHEN OTHERS THEN
   ROLLBACK;

END;

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

默认情况下,使用定义权限定义过程(与AUTHID DEFINER相同,请参阅https://docs.oracle.com/database/121/DBSEG/dr_ir.htm)。
这意味着它们是使用它们所定义的模式的权限执行的。 如果在这样的存储过程中存在没有引用模式的表,则该表将从定义者的模式解析为表。

在您的情况下,OTHER_SCHEMA.pro_do_other_things会从OTHER_SCHEMA.acc_status中选择,而不是从架构中的acc_status中选择。

当您将过程定义为AUTHID CURRENT_USER时,没有架构的引用表将被解析为调用者模式中的表。

在这种情况下,OTHER_SCHEMA.pro_do_other_things会在您的架构中选择acc_status

注意:无论调用者是否总是想要引用同一个表,您必须使用模式明确地使用它,或者您必须创建并使用同义词。