Java Hibernate + Oracle 11.2锁定

时间:2011-10-10 14:52:40

标签: oracle hibernate tomcat synchronization locking

我需要在应用程序启动期间将我的用户表与存储库(另一个数据库)同步。我有两个带有Apache mod_jk的Tomcat节点。因此,当我重新启动它们时,我会进行双重插入和双重更新。这好像是: T1开始 T2开始 T1读取数据 T2读取数据 T1修改数据 T2修改相同的数据 T1插入 T2插入 T1提交 T2提交

当T1修改数据然后T2修改相同的数据时,我丢失了更新。 当然,我在插入操作期间有重复。 我该如何进行同步?

  1. 我想我可以使用“select * for update”锁定所有表(例如)并执行两次同步。一个完整,另一个空。
  2. 我可以为此创建特殊表,并将STATUS列放在那里。当一个节点启动时,它执行STAT FOR字段的SELECT FOR UPDATE并将其更改为“RUNNING”。当另一个事务读取STATUS时,如果它被设置为“RUNNING”,它就不会执行同步。
  3. 什么是最好的解决方案?任何其他建议。 谢谢!

2 个答案:

答案 0 :(得分:1)

问题是,如果使用多个服务器来托管应用程序,则服务器启动并不意味着应用程序启动。

如果您始终同时启动和停止两个服务器,只需配置其中一个(通过web.xml文件中的config参数或系统属性)来执行同步。

如果每个服务器都可以独立启动和停止,那么我不会在启动时做任何事情,而是将其作为应用程序的管理用例实现,并从外部按需触发它。

答案 1 :(得分:0)

配置一台服务器,使其不进行同步 - 正如JB Nizet所说。在我们的项目中,我们使用Spring profiles

无论如何,如果您在业务键上定义了唯一索引,则不应该重复。您可以在Hibernate中使用optimistic locking删除Oracle丢失的更新。事务将尝试更新特定版本(它读取的版本),如果另一个事务使用新版本计数器更新它,则会出错。