当我执行以下操作时,我注意到了:
update t set x = 1 where x = 0; // (1) session 1
update t set x = 2 where x = 0; // (2) session 2
commit; // (3) session 2
在第(2)行,会话2将等待会话(1)提交。
问题是我可能有很多用户使用此表,但我不希望持有会话的用户阻止所有其他用户。
理想情况下,我希望会话2提交成功,然后会话1在尝试提交时抛出错误,如下所述:Optimistic concurrency control。
有没有办法让Oracle以这种方式行事? (如果有所不同,我正在使用Oracle 10g。)
理由和(可能是糟糕的)解决方案
我有一个夜间复制过程,可能会影响表上的行。我不希望在其中一行上打开会话的用户阻止此操作。
我能想到解决这个问题的唯一方法是不给用户直接表访问,而是创建一个可更新的视图或写入临时表的PL / SQL函数,然后为用户提供执行实际写入和提交。这样,行将被锁定的时间将仅在执行“提交过程”期间,这将是有限的。
我想要一个像这样的解决方案,但最好更容易。