我是hibernate的新手,并尝试解决我们的应用程序的一个谜,它大量使用hibernate来持久化MySQL中的数据。
我发现有时属性没有在DB中设置期望值。
经过一些分析后,我看到当DBCommit线程提交事务时,同时应用程序线程也在更新提交者线程试图提交的同一个对象,并且在该竞争中,更新不会反映相同的值数据库符合预期。
所以我的问题:在应用程序代码和持久层中共享同一个对象是一个好习惯,还是应用程序线程总是创建对象的深层副本,然后将对象移交给DB Committer线程。 / p>
请详细说明,请考虑以下事项: 应用程序接收一个事件E1,因为这是我们创建一个名为R1的对象的第一个事件,应用程序线程为R1设置所有字段值,然后将其发送到DBManager。接收此R1的此DBManager放入批处理数组并将调用返回给应用程序。应用程序现在将对象R1放到它的应用程序缓存中。
现在当批处理线程从批处理数组中获取对象时,它会执行以下操作: - 检索会话 - 开始交易 - 使用saveOrUpdate将对象保存到事务中 - 然后提交交易。
现在当批处理线程提交事务时,应用程序线程接收另一个事件E2,它从应用程序缓存中检索对象R1并开始更新几个字段。
提交事务后,我看到几个值不正确。
然后对此更新重复相同的过程,并完成DB saveOrUpdate,然后提交。虽然价值仍不正确。
我想知道在上面的场景中,可以使用一些旧值来暂停udpate R1对象,这些旧值可以覆盖应用程序线程更新的值。
请建议。