数日前に本番サイトにトリガーをデプロイした後、データベース内の「同期されていない」データに気付いたという懸念があるmysqlトリガーがあります。
ここに投稿するために、コードを簡略化しました。
3つのテーブルがあります:
スコアテーブル:ID、UserID、Score、GameID(ユーザーはゲームをプレイするたびにスコアを入力します。同じゲームを何度もプレイできます)
score_summaryテーブル:ID、UserID、GameID、SummaryValue(このテーブルは、各ゲームの各ユーザーの実行スコアを保持します)
game_summaryテーブル:ID、GameID、SummaryValue(このテーブルは各ゲームの実行中の全体的なスコアを保持します)
ユーザーのゲームスコアがスコアテーブルに入力されると、トリガーは、テーブルscore_summary内のユーザーの現在の合計スコア(SummaryValue)を更新し、指定されたGameIDのgame_summaryテーブルを更新するためにあります。
CREATE TRIGGER scores_insert_trigger AFTER INSERT ON scores
FOR EACH ROW BEGIN
UPDATE scores_summary
SET SummaryValue=SummaryValue + NEW.Score
WHERE UserID=NEW.UserID
SELECT ROW_COUNT() INTO rowCount;
IF (rowCount=0) THEN
INSERT INTO scores_summary
(UserID, GameID, SummaryValue)
VALUES
(NEW.UserID, NEW.GameID, NEW.Score);
END IF;
UPDATE game_summary
SET SummaryValue=SummaryValue + NEW.Score
WHERE GameID=NEW.GameID
SELECT ROW_COUNT() INTO rowCount;
IF (rowCount=0) THEN
INSERT INTO game_summary
(GameID, SummaryValue)
VALUES
(NEW.GameID, NEW.Score);
END IF;
END;
私の懸念は、複数のユーザーが同時にスコアを入力した場合、特に特定のゲームのスコアが存在しない場合のgame_summaryの更新の場合、2人のユーザーが同時にこれを試みた場合に、競合状態に陥るトリガーに関するものです。時間、それらは両方ともrowCount = 0を取得し、次に両方とも挿入を行いますか?
私の懸念は正当化されていますか?もしそうなら、これについて私ができることはありますか?
よろしくお願いします。