2013-02-08 101 views
1

我有一個基於soap的web服務,使用Java + Mysql。使用觸發器在mysql行中進行併發更新

Web服務包含保存併發送作爲響應生成的文檔。每個用戶都有數量有限的可用文檔。這項服務爲外部系統提供文件,因此,我必須隨時瞭解特定用戶可用的文件。

爲了改善這一點,構建一個觸發器,在創建新文檔時更新用戶行。

CREATE TRIGGER `Service`.`discount_doc_fromplan` 
AFTER INSERT ON `Service`.`Doc` FOR EACH ROW 
UPDATE `Service`.`User` SET User.DocAvailable = User.DocAvailable - 1 where User.id = NEW.idUser 

問題出在當用戶由於系統而試圖同時創建2個或更多文檔時。這給了我一個「嘗試鎖定時發現的死鎖」。

有人有一個想法來改善這種沒有死鎖問題,同時有適當數量的文件可用?這是我的第一個Web服務。謝謝。

回答

0

您正試圖在數據庫觸發器內實現您的業務邏輯。您可以在(1)Web服務應用程序中間件或(2)存儲過程中實現此邏輯,而不是觸發器。儘管如此,我更喜歡方法(1)。其中的基本代碼將在累積計數器中收集用戶在Doc表中的所有插入,並在所有插入的末尾收集所有插入,並一次更新UserDocAvailable = DocAvailable -counter。您可以在事務中執行此操作,以便在發生問題時可以回滾。在開始交易之前,您必須閱讀userDoc quota