是否可以使用Spring JpaTemplate方法使用PESIMISTIC鎖定選項?JPA悲觀鎖定和Spring中的JpaTemplate
我知道可以使用EntityManager的方法來執行PESIMISTIC鎖。
Account acc = em.find(Account.class,123);
em.lock(acc,PESIMISTIC);
是否可以使用Spring JpaTemplate方法使用PESIMISTIC鎖定選項?JPA悲觀鎖定和Spring中的JpaTemplate
我知道可以使用EntityManager的方法來執行PESIMISTIC鎖。
Account acc = em.find(Account.class,123);
em.lock(acc,PESIMISTIC);
沒有什麼特別的JpaTemplate
這個年代,但如果你需要訪問它,你可以使用JpaTemplate.execute()
,這需要它與EntityManager
提供的回調,你可以做任何你喜歡的回調中。
根據您的情況,更好的解決方案可能是使用Spring's transaction layer。如果您使用@Transactional
(請參閱上一個鏈接)註釋您的DAO,則JpaTransactionManager
應爲您管理實體鎖定,具體取決於@Transactional
屬性的isolation
屬性。
我想在方法註釋級別使用isolation屬性,但JPA似乎不支持DEFAULT隔離級別以外的其他級別: 'org.springframework.transaction.InvalidIsolationLevelException:標準JPA不支持自定義隔離級別 - 使用特殊的JpaDialect for你的JPA實現' – 2010-03-02 10:19:01
人們常常發現普通的JPA不夠好,他們需要使用專有的擴展來完成工作。你使用的是什麼JPA實現? – skaffman 2010-03-02 13:44:19
我們正在使用EclipseLink – 2010-03-02 13:48:23
根據您的默認隔離級別,找到後跟鎖定可能會導致出現一致性問題。此外,您發佈的代碼可能會變成兩次數據庫往返,而不僅僅是一次。這將會是最好的事:
em.find(Account.class, 123, PESSIMISTIC);
或者,如果你正在使用JPA 1:
Account acc = em.getReference(Account.class, 123); em.lock(acc, PESSIMISTIC);
(這不是一個問題的答案本身,而是一個關於評論OP的代碼。不幸的是,Stack Overflow評論似乎不支持格式化。)
您使用的是哪種數據庫提供程序? – 2011-07-29 11:02:35