使用JPA和独占锁进行并发访问时会发生什么?

时间:2016-02-01 11:25:38

标签: java jpa java-ee

我们目前正在讨论我们的架构。

我们的想法是拥有一个数据库和多个处理单元。一个事务确实包括以下步骤:

  1. 根据标志
  2. 查询条目
  3. 请求此条目的独占锁定
  4. 进行处理
  5. 更新标志和其他一些列
  6. 解除锁定并提交交易
  7. 但是如果第二个处理单元查询一个条目,而第一个处理单元确实持有一个锁,会发生什么?

    由于事务隔离和dirty read

    ,在事务期间更新标志不起作用

    在我看来,这种情况的可能结果是:

    • 第二个处理单元获取相同的条目,并在lockrequest期间引发异常
    • 第二个获得下一个可用条目,一切都很好。

1 个答案:

答案 0 :(得分:1)

第二个处理单元获得相同的条目。

但是,在第一个事务释放锁之前是否会抛出异常或锁定获取将取决于您在第二个事务中请求锁定的方式(例如,使用timeout或{{ 1}}或类似的东西)。

第二种情况(第二种情况获得下一个可用条目)有点难以实现。并发事务彼此隔离,因此它们基本上会看到相同的数据快照,直到其中一个提交为止。

您可以查看一些特定于数据库的功能,例如Oracle Advanced Queue,或者您可以更改读取数据的方法(例如,批量读取它们,然后将处理分配给多个线程/事务)。所有这些在很大程度上取决于您正在解决的问题,是否有任何处理顺序限制,故障/回滚/重试处理等。

相关问题