共享数据的一致性,使陈旧数据对象的写入无效

Consistency of shared data, invalidate write of stale data object

我有一个场景,我想使写操作无效。简述以下场景:

在完全不同的系统中有两个进程运行,我们有一个共同的数据库。将过程命名为 'P1' 和 'P2'。每个进程都可以进行读(R)和写(W)操作。 R1和W1表示P1和R2的操作,W2表示P2的操作。让我们采用一个普通的数据库对象 (O)。

现在操作按以下顺序执行:

R1(进程 'P1' 读取 'O')
R2(进程 'P2' 读取 'O')
W1(由进程 'P1' 写入 'O')-> 这会使 P2 的 'O' 变脏
现在我想要的是在执行其 W2 操作时使 P2 失败,因为它包含旧的不一致对象。

我读过一些关于在持久化之前检查时间戳的博客,但这不是解决方案(因为即使是毫秒级的问题也很容易出错)。
我想知道企业级解决方案。
我也想知道如何通过使用像 hibernate 这样的第三方解决方案来实现它。

你需要optimistic locking。在休眠中,您可以为每个实体提供带有注释为 @version 的单独数字字段的乐观锁定。每个插入或更新操作都会将此字段值递增 1,并避免陈旧数据(具有较低版本值)持久保存到数据库中。