JPA悲观锁定和Spring中的JpaTemplate

时间:2010-03-01 21:01:29

标签: java spring jpa

是否可以使用Spring JpaTemplate方法使用PESIMISTIC锁定选项?

我知道可以使用EntityManager的方法执行PESIMISTIC锁定,例如

  

帐户acc = em.find(Account.class,123);

     

em.lock(acc,PESIMISTIC);

2 个答案:

答案 0 :(得分:1)

JpaTemplate上没有具体的内容,但如果您需要访问它,可以使用JpaTemplate.execute(),它会接受EntityManager提供的回调,您可以在回调中做任何你喜欢的事。

根据您的具体情况,更好的解决方案可能是使用Spring's transaction layer。如果您使用@Transactional注释DAO(请参阅上一个链接),JpaTransactionManager应该为您管理实体锁定,具体取决于isolation属性的@Transactional属性。

答案 1 :(得分:0)

根据您的默认隔离级别,查找后跟一个锁可能会让您对一致性问题持开放态度。此外,您发布的代码可能会变成两个数据库往返而不是一个。最好这样做:

  em.find(Account.class, 123, PESSIMISTIC);

或者,如果您使用的是JPA 1:

  Account acc = em.getReference(Account.class, 123);
  em.lock(acc, PESSIMISTIC);

(这不是问题本身的答案,而是对OP代码的评论。遗憾的是,Stack Overflow评论似乎不支持格式化。)