小编Mir*_*zaP的帖子

在MySql中插入后触发的竞争条件

我有一个mysql触发器,我担心在几天前将触发器部署到我的生产站点之后在我的数据库中发现了一些"未同步"的数据.

为了在这里发布,我简化了我的代码.

有3个表:

得分表:ID,UserID,Score,GameID(用户每次玩游戏时输入一个分数,他们可以多次玩同一个游戏)

score_summary table: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;
Run Code Online (Sandbox Code Playgroud)

我担心的是,如果多个用户同时输入分数,则触发器会进入竞争状态 - 特别是当特定游戏没有分数时更新game_summary - 如果两个用户同时尝试这一点时间,他们都会得到rowCount = …

mysql triggers race-condition

5
推荐指数
1
解决办法
1270
查看次数

标签 统计

mysql ×1

race-condition ×1

triggers ×1