使用TRIGGER在mySQL INSERT上进行计时问题

时间:2014-02-13 16:26:48

标签: php mysql triggers

对于iPad应用程序,我创建了一个Web服务,当用户启动应用程序时,该服务会在我的团队表中创建一个新的表行。 PHP生成一个唯一的ID并填充其他一些字段。

此外,我在插入的mySQL中的teams表上创建了一个触发器,其中根据特定日期,项目和组的已插入行自动生成teamnumber。

不幸的是,有时我在向表中插入新行时似乎有时间问题。如果两个应用程序在同一秒内创建一个团队(毫秒?),mySQL触发器的结果将是两个应用程序的相同团队编号。因此,不是拥有团队编号1和2,而是两个应用都拥有团队编号1。

我的团队表看起来像这样:

TeamID | pProject | group | teamnumber | languagecode | created_at

mySQL的触发器:

CREATE TRIGGER after_team_insert BEFORE INSERT ON teams 

FOR EACH ROW
BEGIN

SELECT COUNT( * ) INTO @counter
FROM teams
WHERE DATE( created_at ) = DATE( NOW( ) )
AND teams.group = NEW.group
AND teams.pProject = NEW.pProject;

SET NEW.teamnumber = CAST(@counter AS UNSIGNED) + 1;

END;

我认为我的问题与将行插入数据库的并行线程有关,因此当触发器工作时会得到错误的计数。

有没有人有这个问题的解决方案,还是我必须在PHP中使用某种队列来防止这种团队数量加倍?

提前致谢, 卡斯滕。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

如果出于任何原因,您无法锁定表格,可以尝试以不同方式处理问题:

  • 在列组/ pProject / teamnumber上添加唯一约束。
  • 处理代码中的任何约束错误,检查团队编号是否有问题,然后尝试重新评估它。
  • 确保您已经设置了团队编号。如果没有,请再试一次。

不是那么干净,有点棘手,但是如果你不介意在第4队之后插入第3队,那就应该做好。