0

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

比方说,我们有一个表stories,其中有 2 个字段正在考虑中:
( story_id and comments_count)

和其他 2 个表:

  1. regcomments (comment_id, story_id, comment_text)
  2. unregcomments (comment_id, story_id, comment_text)

现在,在为 any 插入任何新评论之前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。所以两个插入都将被写入 regcomments,使 regcomments 计数为 101,这违反了我的业务规则。任何人都有任何想法,事情如何发展。或者关于我应该如何处理这种情况的任何想法。(不要问我为什么要使用 2 张桌子:P)

4

2 回答 2

0

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

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

于 2013-02-04T19:53:15.807 回答
0

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

于 2013-02-04T22:18:45.527 回答