0

値をインクリメントしてから取得して返す次の関数があります。私が直面する可能性があると考えている問題の 1 つは、更新と別のトランザクションの選択の間に 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;
4

1 に答える 1

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;
于 2012-12-20T16:38:27.060 に答える