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

时间:2011-06-21 14:26:51

标签: sql oracle optimistic-concurrency

我有一个包含一些表的数据库以及其中的数据。我需要为所有表实现乐观并发。

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

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

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

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

select owa_opt_lock.checksum('SCOTT','EMP',ROWID)
from emp
where empno = 123;

这可以在最初获取记录时调用,并在保存更改之前再次调用;如果2个值不同,那么其他人就已经更改了记录。

答案 1 :(得分:4)

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

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