php - 使用条件更新查询管理并发

标签 php mysql database-design concurrency database-concurrency

我正在使用mysql、php。 table 用户聚会 id, user_id, meetup_id 和 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 作为默认值,并在创建聚会后立即创建记录) 现在如果使用像这样的更新查询 更新 user_meetup_count 设置 user_count = user_count + 1 其中 user_count < 10 如果我根据上述查询更新的行数写入 user_meetup 表 如果它返回 0 表示它已满,如果它返回 1 我得到了位置

如果 2 个用户同时尝试,这会起作用吗? 我解决并发问题的方法对吗? 有没有更好的办法 ? 测试此类情况的工具是什么?

最佳答案

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

或者您可以使用 GET_LOCK然后 RELEASE_LOCK . 有了这个,您不需要锁定所有条目表。

或探索关于 gap locking 的主题对于 innodb 表。 有了这个,您需要使用事务。

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

关于php - 使用条件更新查询管理并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17319564/

相关文章:

php - 如何抓取搜索结果的id来自

mysql - 存储 20 个国家/地区 30 个类别的项目总计

database - 规范化和历史数据

php - Symfony2 ParamConverter 不与 @Annotation 关联(任何文件更改后必须清除缓存)

php - CakePhp,MySQL "Like"如何作为不区分大小写的搜索工作

php - 从PDO的查询方法中获取数组结果类型

MySQL 工作台扩展属性?

php - $wpdb->insert() 不会在表中插入记录

sqlite - SQLite 中的简单书签管理器

php - 如何提高PHP性能?