2010-03-01 107 views
2

是否可以使用Spring JpaTemplate方法使用PESIMISTIC鎖定選項?JPA悲觀鎖定和Spring中的JpaTemplate

我知道可以使用EntityManager的方法來執行PESIMISTIC鎖。

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

em.lock(acc,PESIMISTIC);

+0

您使用的是哪種數據庫提供程序? – 2011-07-29 11:02:35

回答

1

沒有什麼特別的JpaTemplate這個年代,但如果你需要訪問它,你可以使用JpaTemplate.execute(),這需要它與EntityManager提供的回調,你可以做任何你喜歡的回調中。

根據您的情況,更好的解決方案可能是使用Spring's transaction layer。如果您使用@Transactional(請參閱上一個鏈接)註釋您的DAO,則JpaTransactionManager應爲您管理實體鎖定,具體取決於@Transactional屬性的isolation屬性。

+0

我想在方法註釋級別使用isolation屬性,但JPA似乎不支持DEFAULT隔離級別以外的其他級別: 'org.springframework.transaction.InvalidIsolationLevelException:標準JPA不支持自定義隔離級別 - 使用特殊的JpaDialect for你的JPA實現' – 2010-03-02 10:19:01

+0

人們常常發現普通的JPA不夠好,他們需要使用專有的擴展來完成工作。你使用的是什麼JPA實現? – skaffman 2010-03-02 13:44:19

+0

我們正在使用EclipseLink – 2010-03-02 13:48:23

0

根據您的默認隔離級別,找到後跟鎖定可能會導致出現一致性問題。此外,您發佈的代碼可能會變成兩次數據庫往返,而不僅僅是一次。這將會是最好的事:

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

或者,如果你正在使用JPA 1:

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

(這不是一個問題的答案本身,而是一個關於評論OP的代碼。不幸的是,Stack Overflow評論似乎不支持格式化。)