php mysql有条件地将行插入到不同的表中

时间:2013-02-04 19:48:00

标签: php mysql

我根据条件在两个不同的表中插入一行。

假设我们有一个名为stories的表,正在考虑2个字段:
story_id and comments_count

和另外2个表:

  1. regcomments (comment_id, story_id, comment_text)
  2. unregcomments (comment_id, story_id, comment_text)
  3. 现在,在为任何story_id插入任何新评论之前,我只想检查comments_count是否小于100.如果是,则应将该行插入regcomments,否则,该行应插入unregcomments

    这是我如何做到的伪代码:

    select comments_count from stories where story_id = x
    if comment_count<100
        insert into regcomments
    else
        insert into unregcomments
    

    现在我所关心的是,如果有多个用户正在访问此脚本,是否有可能会失败?例如,一个故事有99条评论。 2个用户同时完全调用此功能。第一个选择查询同时针对两者执行,并且它们都获得99.因此两个插入都将进行注册,从而计算注册表101,这违反了我的业务规则。任何人都有任何想法,事情如何。或者关于我应该如何处理这种情况的任何想法。 (不要问我为什么要使用2张桌子:P无论如何)

2 个答案:

答案 0 :(得分:0)

是的,它可以/将会失败,因为10个请求可能都会从SQL查询中收到99个comments_count,每次将新行插入到regcomments中,然后表中将有109行。

一种可能的解决方案是将检查逻辑移动到SQL中(使用带锁定/互斥锁的存储过程)。

答案 1 :(得分:0)

对表使用InnoDB引擎并将整个操作包装在事务中。 InnoDB将为您处理并发问题。只需准备好代码来处理插入/更新语句中的错误。我想你必须设置一个高隔离级别,以确保在其他操作正在进行时select不会运行。如果这不起作用,您可能需要使用LOCK TABLE。丑陋但会完成这项工作。