Java Hibernate + Oracle 11.2 锁定

发布于 2024-12-09 08:00:14 字数 482 浏览 0 评论 0原文

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

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

  1. 我想我可以使用“select * for update”(例如)锁定所有表并执行两次同步。一间满了,一间空了。
  2. 我可以为此创建特殊表并将 STATUS 列放在那里。当一个节点启动时,它会执行 STATUS 字段的 SELECT FOR UPDATE 并将其更改为“RUNNING”。当其他事务读取 STATUS 时,如果它设置为“RUNNING”,则不会执行同步。

最好的解决方案是什么?任何其他建议。 谢谢!

I need to synchronize my user table with repository(the other DB) during application startup. I have two Tomcat nodes with Apache mod_jk. So when I restart both of them I make double inserts and double updates. It seems like:
T1 begin
T2 begin
T1 read the data
T2 read the data
T1 modify the data
T2 modify the same data
T1 insert
T2 insert
T1 commit
T2 commit

When T1 modifies the data and then T2 modifies the same data I have lost update.
And of course I have duplicates during insert operation.
How should I do the synchronization?

  1. I suppose I can lock all the table using "select * for update" (for instance) and perform two synchronizations. One full and the other one empty.
  2. I can create special table for this and put STATUS colum there. When one node starts it performs SELECT FOR UPDATE of the STATUS field and changes it to "RUNNING". When the other transaction reads the STATUS it doesn't perform synchronization if it's set to "RUNNING".

What's the best solution? Any other suggestions.
Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

懒的傷心 2024-12-16 08:00:14

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

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

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

The problem is that server startup doesn't mean application startup if more than one server is used to host the application.

If you always start and stop both servers at the same time, just configure only one of them (via a config parameter in the web.xml file, or a system property) to perform the synchronization.

If every server can be started and stopped independently, then I would not do anything at startup, but rather implement it as an administration use-case of the application, and trigger it on-demand, from the outside.

热鲨 2024-12-16 08:00:14

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

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

Configure one server so that it does not do the synchronisation - just as JB Nizet said. In our project we use Spring profiles.

Anyway, you should not get duplicates if you defined a unique index on a business key. You can get rid of Oracle's lost updates using optimistic locking in Hibernate. A transaction would try to update a specific version (the one it read) and get an error if another transaction updated it with a new version counter.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文