在遗留数据库上实现乐观并发

use*_*034 7 sql oracle optimistic-concurrency

我有一个数据库,里面有一些表,还有数据.我需要为所有表实现乐观并发.

我想知道什么是最好的方式.

将在应用程序端创建带谓词的查询.

我关心的是如何存储rowversion(timestamp)值.

首先我考虑使用ora_rowscn作为rowversion值,但后来我意识到我必须重新创建所有表来设置ora_rowscn.也许只是添加某种时间戳列会很好,但是我会被迫为应用程序中的每次更新创建并保存一个新的时间戳值.

有任何想法吗 ?

Ton*_*ews 7

Oracle有一个用于乐观锁定的内置包,名为OWA_OPT_LOCK.这可以用于为任何行生成校验和,如下所示:

select owa_opt_lock.checksum('SCOTT','EMP',ROWID)
from emp
where empno = 123;
Run Code Online (Sandbox Code Playgroud)

这可以在最初获取记录时调用,并在保存更改之前再次调用; 如果2个值不同,则其他人在您获得记录后更改了记录.


Pet*_* G. 5

一个非常简单但有效的模式是首先获取要编辑的整行而不保持锁定。当您最终准备好更新时,请使用诸如 之类的子句来扩充 where 子句COLUMNA='OLDVALUEA'。更改记录的数量表明其他修改是否干扰了您的乐观更新。

当您尝试更新时,此方法将注意到仍然有效的所有修改。任何依赖校验和的方法都可能错误地表明没有发生任何修改。您需要的可靠性取决于您的应用。我不会把人的生命押在校验和上。然而,在这种情况下,我也尽量不依赖乐观的更新。