【问题标题】:Concurrency issue in JPAJPA 中的并发问题
【发布时间】:2015-12-28 01:37:21
【问题描述】:

我们已经将我们的应用程序部署在两个具有集群环境的应用程序服务器(Tomcat 服务器)中。现在请求同时来自两台服务器,因此发生并发问题,这意味着它正在数据库中创建重复条目。 场景是: 1.请求(交易)A更新数据 2.请求(交易)B同时更新数据 3. 两行将添加到该表中。其中一个是重复的。

假设我有以下签名的方法

请求一个

updateData() {  
  //get entity manager
  //start transcation tx
  //persist
  //commit tx
}

请求 B

updateData() {
  //get entity manager
  //start transcation tx
  //persist
  //commit tx
}

我们希望防止出现这种情况。请求 A 只应将数据持久保存到该表中。帮助我们解决这个问题。 #谢谢 环境详情:JPA 2.1 和 Oracle 数据库

【问题讨论】:

  • 为什么更新操作会插入行?或者你的意思是说第二次更新覆盖了第一次更新,而第二次更新不知道第一次更新。
  • 应用程序有什么方法可以告诉它们是重复请求吗?也许某些东西唯一地标识了对象,并将数据库中的该字段或字段集标记为唯一,因为这会导致第二个事务失败。否则,您需要查看服务器本身的解决方案,以免“相同”请求被重复并发送到多个服务器。
  • 表上没有唯一的约束可以防止第二个请求失败吗?

标签: java spring hibernate jpa oracle11g


【解决方案1】:

您需要能够判断 2 个并发消息是等​​效的,并且只有其中一个应该在数据库中创建记录。使用插入,不可能使一个插入阻止另一个插入来自不同的请求。 JPA 锁在这里没有帮助,因为新行不共享任何共同点。如果您可能会想到在第一次插入发生后会阻止第二次插入的 DB 约束,那么该约束可能是您的解决方案。

如果您有某种关联 ID,这对于两个请求都是相同的,那么您可以创建一个额外的日志表并尝试将该关联 ID 存储到该表中。然后很容易在该日志表上放置一个唯一约束,这样一个相关 id 只能存储一次,并且任何后续使用该 id 存储实体的尝试都将被回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多