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

时间:2015-02-10 05:10:31

标签: php mysql concurrency transactions locking

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

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

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

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

ERD

可供选择的各种小部件和小工具,但每个小部件和每个小工具都是唯一的,一次只能在一个组中使用。

问题在于购买一个系列。我需要确保当用户点击“立即购买”按钮时,他们为其窗口小部件组选择的窗口小部件以及他们为其小工具组选择的小工具尚未在另一个付费收藏集中使用。< / p>

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

所以我今天一直在阅读有关交易和锁定的大量内容。我认为这必须涉及我的解决方案,但我在查看这可能如何工作方面遇到了很多麻烦。

目前我能想到的就是这样:在点击立即购买按钮时,我开始一个交易,然后运行一个查询来锁定(以防止阅读写通过其他会话)窗口小部件表中的所有行,以及集合中列出的每个项目的小工具表中的所有行。启动事务并锁定到位后,我可以运行查询来测试是否已经使用了任何选定的项目。 如果查询表明商品未使用,我会允许购买继续进行,一旦完成,我会释放锁。

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

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

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

非常感谢您提前

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

1 个答案:

答案 0 :(得分:1)

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

尽量不要在打开交易时进行分析;预测试,启动事务,设置乐观锁定,结束事务,检查哪些成功,以及某些已经锁定,释放刚刚设置的锁定。你的数据库会感谢你。