2012-07-12 100 views
1

我有以下問題。 有一個交易,下面是。休眠,高併發問題

交易:

  1. 查看數據庫,如果有可用參數的對象。
  2. 如果不是,則創建該對象,否則更改該對象並進行更新。

假設我們有兩個並行執行的事務(T1和T2)。

T1看數據庫,沒有對象。 A毫秒後,T2看着數據庫,也沒有對象。

T1將對象保存到數據庫中,它也使T2。

我們在數據庫中有兩個對象,而不是一個。

我們可以解決這個問題嗎?

我正在使用:休眠+彈簧+ Tomcat

謝謝。

+0

如果您的數據庫引擎支持下一個鍵鎖定,請選擇... FOR UPDATE解決此問題([MySQL doc](http://dev.mysql.com/doc/refman/5.6/en/innodb-next-key -locking.html))。 – 2012-07-12 22:01:46

回答

2

對於部署在一臺服務器上的應用程序,解決方案非常簡單。賦予函數「synchronized」屬性。這樣你就可以確定這個問題不會發生。

如果您在多個服務器上運行此應用程序,則可能會出現此問題。在這種情況下,您應該考慮一個集中的數據庫訪問機制。

這也可以使用sql server的功能來完成。在數據庫服務器上創建一個存儲過程併爲其提供適當的隔離級別。你可以在這裏閱讀:set isolation level for postgresql stored procedures

0

如果兩個相同的對象被插入到數據庫中,那麼會有一個主鍵衝突,所以你的一個事務將無法寫入並且會回滾。只需確保對象的屬性必須具有相應的約束條件纔是唯一的。