使用条件的更新查询来管理并发

时间:2013-06-26 12:06:58

标签: php mysql database-design concurrency database-concurrency

我正在使用mysql,php。 表 user_meetup id,user_id,meetup_id with unique on(user_id,meetup_id) 如果我的聚会受到地方(10个地方)的限制,9个用户已经标记了rsvp,如果有2个用户同时进行RSVP(我只考虑并发的情况)

A -> select count(id) from user_meetup -> result : 9 hence go ahead
B -> select count(id) from user_meetup -> result : 9 hence go ahead
A -> insert ......   
B -> insert ......

现在他们两个都会到位,我的数量变成了11, 我的解决方案是再添加一个表 user_meetup_count id,meetup_id,user_count(计数设置为0作为默认值,并在创建聚会时立即创建记录) 现在如果使用更新查询就好了     update user_meetup_count set user_count = user_count + 1其中user_count< 10 如果我根据上面查询更新的行数写入user_meetup表 如果它返回0意味着它已满,如果它返回1则我得到了地方

这样可以在2个用户同时尝试的情况下使用吗? 是我解决并发问题的方法吗? 有没有更好的办法 ? 测试此类情况的工具有哪些?

1 个答案:

答案 0 :(得分:1)

在计算之前使用lock tables。插入后解锁。

或者您可以使用GET_LOCK然后使用RELEASE_LOCK使用此功能,您无需锁定所有条目表。

或者探索关于innodb表的gap locking主题。 有了这个,你需要使用交易。

您可以使用jMeter来测试您的查询。