处理Spring中的脏读,使用JPA进行Hibernate

时间:2015-10-06 10:33:48

标签: java spring hibernate jpa transactions

我们有一个在负载均衡器下运行的Web应用程序。两个用户正在尝试执行相同的操作,例如两个用户同时提出相同的订单,这会创建重复的订单。

在一个事务提交之前,另一个请求正在检查是否有任何订单。它正在创建重复的条目。请求正在尝试同时处理。

  1. 用户A& B同时提出订单。
  2. 用户A的交易验证了同一订单是否存在任何现有条目。如果同一订单没有其他条目,则会创建一个条目。
  3. 用户B的交易也会验证并创建相同的内容。
  4. 如果A&#39的交易完成,那么B的交易将不会发生。但在事务提交之前,这两个请求都是有效的,因此它为同一个订单创建了两个条目(重复。)
  5. 我们尝试了以下选项,

    1. 将锁定类型锁定为OPTIMISTIC_FORCE_INCREMENT
    2. 的实体管理员
    3. 将方法设为同步
    4. 隔离级别为SERIALIZABLE
    5. 但没有一个选项有帮助。

      请建议如何继续。

      由于

1 个答案:

答案 0 :(得分:0)

设置一个包含下一个订单号的单独数据库表。

将订单的创建拆分为两个单独的数据库事务。

第一个读取并更新订单号。

第二个存储订单信息。

处理订单时,如果第一笔交易失败,应在继续第二笔交易之前重试。