2015-02-10 98 views
2

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

应用程序用户定制我称之为“集合”的东西。定制完成后,他们可以点击贝宝“立即购买”按钮并购买收藏。

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

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

ERD

宽范围的小窗口和小工具是可用的,从中选择,但每个插件和每个小工具是唯一的,只能是一次使用一组。

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

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

所以我今天一直在做很多关于交易和锁定的阅读。我认为这将会涉及到我的解决方案,但是我很难想象这可能会如何工作。

目前我所能想象的是这样的:当点击Buy Now按钮时,我开始一个事务,然后运行一个查询来锁定(以防止其他会话读取)窗口小部件表中的所有行以及集合中列出的每个项目的小工具表中的所有行。随着事务开始并锁定到位,我可以运行查询来测试是否有任何选定的项目已被使用。 如果查询显示物品未被使用,我会允许购买继续,一旦完成,我会释放锁。

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

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

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

非常感谢你提前

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

回答

1

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

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

+0

听到这很让人放心,谢谢安德拉斯。我将尽一切努力将其作为我的解决方案并回报。对于其他答案,我会将“未回答”问题留出几天时间。 – AMarch 2015-02-10 19:26:14