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

Mir*_*zaP 5 mysql triggers race-condition

我有一个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 = 0然后都会插入?

我的担忧是否合理,如果有的话,我能做些什么呢?

先谢谢你们.

Mir*_*zaP 0

我想针对我的具体情况提供答案。

我的更新语句是原子更新,这意味着 mysql 引擎会处理任何潜在的竞争条件。

为了避免插入时的竞争条件,我选择了 ON DUPLICATE KEY UPDATE,这将再次是原子的,并且将避免两个或多个线程导致创建多行。

感谢您的帮助。