可靠地跟踪Hibernate所做的更改

maa*_*nus 5 java concurrency hibernate transactions

我正在使用PostUpdateEventListener注册的via

registry.appendListeners(EventType.POST_COMMIT_UPDATE, listener)
Run Code Online (Sandbox Code Playgroud)

以及其他一些听众,以便跟踪Hibernate所做的更改.这很好用,但是,我看到一个问题:

比方说,对于跟踪一些amount通过id,我简单地执行

 amountByIdConcurrentMap.put(id, amount);
Run Code Online (Sandbox Code Playgroud)

在每一个POST_COMMIT_UPDATE(让我们忽略其他操作).问题是这个调用在提交后的某个时间发生.因此,两个提交一个接一个地写一个相同的实体,我可以以错误的顺序接收事件,最终amount存储旧的.

  • 这真的有可能还是以某种方式同步操作?
  • 有没有办法如何预防或至少检测到这种情况?

asc*_*erk 3

稍后提出两个问题和一个建议

  1. 您确定需要这种优化吗?为什么不通过查询来获取写入数据库的金额。是什么让您有理由使用缓存。

  2. 如何确保在将金额写入数据库之前的金额计算已正确同步,以便多个线程或可能的节点不会使用旧数据来计算金额,从而覆盖以后计算的结果?

我想你第 2 个问题的处理是正确的。然后你必须选择:

  1. 悲观锁定,这意味着在提交之前,您可以独占地更新缓存,而不会出现并发问题。
  2. 乐观锁定:在这种情况下,您的数据库记录中有一种时间戳或计数器,您也可以将其与金额一起放入缓存中。您可以使用该值来找出最新的值。