2011-01-26 116 views
2

我有一個數據庫表,它有一個列上定義了一個唯一的約束。我也有一個多線程的消息處理系統。當消息被消費時,可能有時候兩個消息包含具有相同值的相同實體(具有定義的唯一約束的列的值)。因此,在代碼中,服務層首先使用這個唯一字段(通過hibernate命名查詢)查詢數據庫,以查看是否有任何記錄首先存在。如果不是,則它插入一條新記錄。如果具有此唯一字段的記錄已經存在,而不是插入記錄,則會更新它並在另一個表中插入子記錄。如何避免使用休眠時違反唯一約束?

我遇到了第二個線程認爲該記錄尚未存在的問題,因此它嘗試插入它。但是,此時第一個線程已成功插入記錄。所以異常會被拋出違反唯一約束。你能幫助什麼是使用hibernate/oracle解決方案來處理這種情況的最佳方式?我需要某種鎖定選項嗎?謝謝。

+0

您聲明您需要Oracle/Hibernate解決方案。是否有一個原因,你不能改變你的消息系統,因此它是同步的?聽起來你已經編寫了它的執行方式,所以你可以用這種方式處理它,而不是在Hibernate或Oracle中處理它。 – 2011-01-26 20:51:41

回答

1

在這種情況下試圖避免回滾違背了MVCC(特別是由Oracle使用)的精神,因爲它需要過度的鎖定。

我認爲最好通過啓動另一個事務來執行更新來回滾插入。