1

我将 Java EE 6 与 JBOSS7 和 JPA2 + Hibernate 一起使用。对于我的客户,我提供了一个 REST api。

我关心的是如何有效地确保没有资源同时被修改。应该经常发生,但如果发生,我想确保正确处理。

到目前为止我的方法:

  1. Map<String, ReentrantLock>存储锁。(我的 id 始终 UUID是 s)如果地图中缺失,则根据需要创建锁。在这种方法中,我喜欢并发访问将被阻止,并且我可以控制其他线程尝试锁定资源的时间。

  2. 使用 JPA2 乐观锁定。

你会推荐哪一个?还是有更好的方法?

4

1 回答 1

3
  1. 似乎容易出错,而且它可能无法扩展。我从未见过这样的设计,我会劝阻它。
  2. 具有乐观锁定的事务是一个可行的选择。在这种情况下,某些事务可能会失败,您将需要处理错误并重试。
  3. 带有悲观锁定的事务是另一个可行的选择。就像 1) 但使用数据库来锁定和排序操作。AFAIK,JPA 也支持悲观锁定。否则,您可以使用 SELECT FOR UPDATE(大多数 DBMS 支持)显式获取行锁。确保您确定一个方案是按一致的顺序获取锁,以避免死锁。

2-3 之间的选择取决于用例,例如,是否预计争用会很高,或者是否容易重试失败的事务。

于 2012-09-04T06:43:32.833 回答