我根据条件在两个不同的表中插入一行。
假设我们有一个名为stories
的表,正在考虑2个字段:
(story_id and comments_count
)
和另外2个表:
regcomments (comment_id, story_id, comment_text)
unregcomments (comment_id, story_id, comment_text)
现在,在为任何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无论如何)
答案 0 :(得分:0)
是的,它可以/将会失败,因为10个请求可能都会从SQL查询中收到99个comments_count,每次将新行插入到regcomments中,然后表中将有109行。
一种可能的解决方案是将检查逻辑移动到SQL中(使用带锁定/互斥锁的存储过程)。
答案 1 :(得分:0)
对表使用InnoDB引擎并将整个操作包装在事务中。 InnoDB将为您处理并发问题。只需准备好代码来处理插入/更新语句中的错误。我想你必须设置一个高隔离级别,以确保在其他操作正在进行时select不会运行。如果这不起作用,您可能需要使用LOCK TABLE。丑陋但会完成这项工作。