PHP + mySQL 和并发数据库访问问题

标签 php mysql concurrency transactions locking

我正在寻求有关如何解决使用 PHP 和 mySQL 构建的 Web 应用程序中的并发访问问题的建议。

应用程序用户自定义我称之为“集合”的东西。定制完成后,他们可以点击 PayPal 的“立即购买”按钮购买该系列。

集合由两组独立的事物组成:一组小部件和一组小工具。 “自定义”涉及选择要将哪些小部件包含在小部件组中,以及要将哪些小部件包含在小部件组中。

这是一种简化的伪实体关系图:

ERD

有多种小部件和小工具可供选择,但每个小部件和小工具都是独一无二的,并且一次只能在一个组中使用。

购买收藏品时会遇到问题。我需要确保当用户单击“立即购买”按钮时,他们为他们的小部件组选择的小部件,以及他们为他们的小工具组选择的小工具尚未在另一个付费集合中使用。

想象一下两个人同时使用该系统。每个人都创建了一个集合*,其中包含一些相同的小部件和/或小工具,然后进入结帐页面,在那里他们都在同一时刻点击了“立即购买”按钮。运行标准查询来测试选定的小部件/小工具是否已经在使用中在这种情况下是不可靠的,因为对于两个用户来说,系统都会回复“这些可用”,并且每个人都可以使用“双倍”购买他们的收藏。预订的资源”(可以说是)。

所以我今天阅读了大量有关事务和锁定的资料。我认为这必须包含在我的解决方案中,但我很难想象它是如何工作的。

目前我所能想到的是这样的:在点击“立即购买”按钮时我开始交易,然后运行查询以锁定(以防止读取写入由其他 session )小部件表中的所有行,以及集合中列出的每个项目的小工具表中的所有行。随着交易的开始和这些锁的到位,我可以运行查询来测试是否有任何选定的项目已经在使用中。 如果查询表明这些元素未使用,我将允许继续购买,一旦完成我将释放锁。

如果查询表明项目已被使用,我会返回一个错误并释放锁。

如果另一个用户试图同时购买包含一些相同小部件/小工具的集合,他们要么会收到锁定超时,我会返回错误;或者他们必须等到另一个 session 移除了它的锁,然后 - 当他们的 session 应用相同的锁并运行相同的查询时 - 他们会看到“已经在使用中”的错误。

所以我有两个问题。这听起来像是处理我的情况的最佳方式吗?其次,如果可以,是否可以按照我描述的方式进行?

非常感谢您

*这可能会被保存以备后用。我允许用户创建包含他们喜欢的任何小部件/小工具的集合——甚至是已经在使用的小部件/小工具——理由是如果他们现在推迟购买,那么当他们稍后继续购买时,这些资源可能会再次可用

最佳答案

是的,是的。是的,这是最好的方法,因为它是最明显和最常用的。是的,这种方法行之有效,我自己使用过它,并且处理过使用它的其他人编写的代码。

尽量不要在持有交易的同时进行分析;预测试,开始事务,设置乐观锁,结束事务,查看哪些成功了,如果有的已经加锁,则释放刚才设置的锁。您的数据库将感谢您。

关于PHP + mySQL 和并发数据库访问问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28424543/

相关文章:

php - laravel 将行插入 mysql 表会导致插入重复行

php - 非工作 session 变量

java - 在多线程环境中使用 HashSet 作为非常简单的缓存是否安全?

multithreading - 并发程序效率和CPU线程数

php - 如何有效地从大表中计算平均值?

PHP脚本发送zip文件并在不工作后删除

mysql - 如何重新编写 SQL 查询

C#并发列表问题

php - MySQL 查询将查找对多个用户名使用相同 IP 地址的用户

php - 无法从 Google App Engine 上的 Php PDO 获取响应 header