【问题标题】:PHP + mySQL and concurrent database access issuesPHP + mySQL 和并发数据库访问问题
【发布时间】:2015-02-10 05:10:30
【问题描述】:

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

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

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

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

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

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

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

所以我今天阅读了大量有关事务和锁定的内容。我认为这必须包含在我的解决方案中,但我在想象这可能如何工作时遇到了很多麻烦。

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

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

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

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

非常感谢您

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

【问题讨论】:

    标签: php mysql concurrency transactions locking


    【解决方案1】:

    是的,是的。是的,这是最好的方法,因为它是最明显和最常用的。是的,这种方法很管用,我自己也使用过,也曾编写过使用它的其他人编写的代码。

    在保持交易状态时尽量不要做分析;预测试,开始事务,设置乐观锁,结束事务,检查哪些成功,如果一些已经被锁定,释放刚刚设置的锁。您的数据库会感谢您。

    【讨论】:

    • 听到这个消息非常令人放心,谢谢安德拉斯。我将尝试将此作为我的解决方案并报告回来。我将把这个问题“悬而未决”几天,等待其他回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    相关资源
    最近更新 更多