2016-12-20 73 views
1

如果我讓在Java代碼中像這樣的電話:當我在JPA代碼中設置鎖定時,它們是在代碼中還是在DBMS中執行?

entityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE); 

是這樣執行的代碼,由DBMS表/行級鎖,或任取決於JPA實現這些的?

謝謝!

+0

如果你的JPA提供者已經實現了「PESSIMISTIC_WRITE」,並且你的RDBMS支持SQL來鎖定一行(FOR UPDATE),那麼它應該把它放到被調用的SQL中。你可以很容易地檢查它是否這樣做,但似乎沒有這樣做... –

回答

1

JPA依靠dbms獲取對資源的鎖定。所以,是的,它會對db實現進行行鎖定。這就是爲什麼我們必須在使用JpA時指定我們的數據庫方言。

+1

實際上,如果你使用Hibernate來告訴它使用哪個RDBMS,你必須指定你的「db方言」;其他JPA提供商可以爲您解決問題,而無需指定這些內容。其餘的答案是正確的 –

0

這是來自Oracle博客摘錄:當讀取數據時,悲觀鎖定模式會鎖定數據庫行。這相當於響應SQL語句SELECT所採取的操作。 。 。 FOR UPDATE [NOWAIT]。

這是維基:的悲觀鎖的SQL語法是特定的數據庫,不同的數據庫有不同的語法和支持水平,所以確保你的數據庫正確支持您的鎖定要求。

還有其他方法可以實現悲觀鎖定,它可以在應用程序級別實現,也可以通過可序列化的事務隔離實現。

相關問題