我有一个 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 - 如果两个用户同时尝试此操作时间,他们都会得到 rowCount=0,然后都会进行插入?
我的担忧是否合理,如果是,我能做些什么吗?
提前谢谢各位。