2012-12-20 59 views
0

我有以下功能,增加一個值,然後檢索並返回它,我想我可能面臨的問題之一是更新和選擇另一個事務更新currentVal值因此產生在檢索錯誤的更新值,我想這是正確的?執行更新,然後選擇併發問題

CREATE FUNCTION INCREMENT() 
RETURNS INT 
BEGIN 
DECLARE newVal; 
UPDATE table_x SET currentVal=currentVal+1; 
SELECT currentVal INTO newVal FROM table_x; 
RETURN newVal; 
END; 

回答

0

我也有過類似的問題,而另一更新或插入交易將更新currentval這是真的。我解決問題的方式是將更新和選擇置於一個會導致表被鎖定的事務中。這將確保您始終獲得currentval。

CREATE FUNCTION INCREMENT() 
RETURNS INT 
BEGIN 
DECLARE newVal; 
Begin tran 
UPDATE table_x SET currentVal=currentVal+1; 
SELECT currentVal INTO newVal FROM table_x; 
Commit tran 
RETURN newVal; 
END; 
+0

對不起,我在SQL中寫道。這裏是mysql CREATE FUNCTION INCREMENT()RETURNS INT BEGIN DECLARE newVal;開始交易; UPDATE table_x SET currentVal = currentVal + 1; SELECT currentVal INTO newVal FROM table_x;承諾;返回newVal;結束; – Stew

+0

實際上並不一定如此。閱讀「事務隔離級別」 – fancyPants

+0

只有當隔離級別設置爲未提交讀取時,我相信這不是默認設置。如果是這樣,那麼我從來沒有碰到它。 – Stew