我有一个数据库,其中包含一些表以及其中的数据。我需要为所有表实现乐观并发。
我想知道什么是最好的方法。
将在应用程序端创建带有谓词的查询。
我关心的是如何存储 rowversion(timestamp) 值。
首先我想使用ora_rowscn作为 rowversion 值,但后来我意识到我必须重新创建所有表来设置ora_rowscn。也许只是添加某种时间戳列会很好,但是我将被迫为应用程序中的每次更新创建并保存一个新的时间戳值。
有任何想法吗 ?
我有一个数据库,其中包含一些表以及其中的数据。我需要为所有表实现乐观并发。
我想知道什么是最好的方法。
将在应用程序端创建带有谓词的查询。
我关心的是如何存储 rowversion(timestamp) 值。
首先我想使用ora_rowscn作为 rowversion 值,但后来我意识到我必须重新创建所有表来设置ora_rowscn。也许只是添加某种时间戳列会很好,但是我将被迫为应用程序中的每次更新创建并保存一个新的时间戳值。
有任何想法吗 ?
Oracle 有一个用于乐观锁定的内置包,称为OWA_OPT_LOCK。这可用于为任何行生成校验和,如下所示:
select owa_opt_lock.checksum('SCOTT','EMP',ROWID)
from emp
where empno = 123;
这可以在最初获取记录时调用,在保存更改之前再次调用;如果这 2 个值不同,则在您获得记录后,其他人已经更改了记录。
一个非常简单但有效的模式是首先获取要编辑的整行而不保持锁定。当您最终准备好进行更新时,在 where 子句中添加类似COLUMNA='OLDVALUEA'
. 更改的记录数表明其他修改是否干扰了您的乐观更新。
当您尝试更新时,此方法将注意到所有仍然有效的修改。任何依赖校验和的方法都可能错误地表明没有进行任何修改。您需要的可靠性取决于您的应用。我不会把人命押在校验和上。但是,在这种情况下,我也尽量不依赖乐观更新。