【问题标题】:Hibernate, high concurrency issue休眠,高并发问题
【发布时间】:2012-07-12 08:03:50
【问题描述】:

我有以下问题。 有一笔交易,下面做。

交易:

  1. 查看数据库,如果有可用参数的对象。
  2. 如果不是,则创建此对象,否则,更改对象并进行更新。

假设我们有两个并行执行的事务(T1 和 T2)。

T1 查看数据库,没有对象。 一毫秒后,T2查看数据库,也没有对象。

T1 将对象保存到数据库中,它也生成了 T2。

我们在数据库中有两个对象而不是一个。

我能解决这个问题吗?

我正在使用:Hibernate + Spring + Tomcat

谢谢。

【问题讨论】:

  • SELECT...如果您的数据库引擎支持下一个键锁定 (MySQL doc),FOR UPDATE 应该可以解决此问题。

标签: database multithreading hibernate concurrency transactions


【解决方案1】:

对于部署在一台服务器上的应用程序,解决方案非常简单。给函数“同步”属性。这样你就可以确定这个问题不会发生。

如果您在多台服务器上运行此应用程序,则可能会出现此问题。在这种情况下,您应该考虑一种集中式数据库访问机制。

这也可以使用 sql server 的功能来完成。在数据库服务器上创建一个存储过程并给它一个适当的隔离级别。你可以在这里阅读:set isolation level for postgresql stored procedures

【讨论】:

    【解决方案2】:

    如果将两个相同的对象插入到数据库中,则会发生主键冲突,因此您的一个事务将无法写入并回滚。只需通过对其属性施加相关约束来确保对象必须是唯一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多