php - "Last minute subscription"项目 PHP/MySQL 原子性问题

标签 php mysql ajax transactions atomic

我正在开发一个 AJAX 应用程序。用户单击一个按钮,他的名字被保存到数据库中并显示在

中,其内容是通过 AJAX 长轮询从数据库中获取的。数据库还包含一个表示过期的时间戳:不得接受超过该时间戳的订阅。用户订阅也有限制。

我有一个由 AJAX 请求调用的 PHP 脚本,该脚本查询数据库并检查是否过期(点击的时间戳由 JavaScript 计算并通过 AJAX 发送)。它还检查用户限制:我在用户和产品(订阅)之间有一个 N 对 N 的关系。这些任务显然需要时间,我担心可能出现的并发问题。我应该使用数据库事务吗?我可以使用什么技术来确保此操作的原子性?

最佳答案

这取决于完成那些“长”任务的工作类型。

一般信息:

如果您只是插入用户驱动的数据和在 PHP 中生成的数据,而无需读取数据和/或与从数据库中获取的数据进行交叉关联,那么事务性应该不是问题。

如果您正在更新数据并将其与数据库中的其他元素交叉关联,那么您需要开始使用事务并仔细选择您计划使用的事务的隔离级别。

当并发增加时,事务会严重影响速度。选择一个非常安全的隔离级别可能比您的应用程序所需的更安全,并且您可能会向 MVCC 添加大量不必要的工作。

同时将事务用作单独的 PHP api 调用并在应用程序中管理回滚逻辑会增加事务的总体持续时间,因为它增加了 PHP 生成的所有处理延迟。如果您可以将数据库通信压缩到一次通信中请求的一组查询中,那就更好了。

案例信息:

让我们考虑这个场景:有 8 个槽,7 个用户订阅。两个用户几乎同时单击订阅按钮。当为最后一个点击用户启动控制脚本时,第一个点击用户的订阅查询可能仍会执行。这意味着系统接受这两个用户作为有效订阅。

这属于我解释的第二种情况,即您将用户驱动的数据与数据库中的数据进行交叉关联的情况。在提交用户驱动器数据之前,您正在读取数据库的状态,所以是的,在这种情况下您需要事务。

有可能推测一个更新语句的内在原子性。任何 UPDATE table_name SET x = x+1 WHERE a = 'value'; 都保证是原子的。您可以利用这一优势。

所有订阅的 PHP 线程必须首先减少订阅者计数。如果减量中受影响的行数不为0,则表示减量成功,可以继续提交用户相关数据,否则告知用户他慢了0.3ms。

关于php - "Last minute subscription"项目 PHP/MySQL 原子性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11631859/

相关文章:

php - 为什么 PHP 文件不用于(自定义)CSS 和 JS?

部分上传的 PHP 文件上传为 "hijacked"

php - 如何验证 PHP 表单输入和数据库提交

php - 根据 wordpress 中的帖子计数对类别/分类法进行排序

mysql - 更新 my.cnf 中的变量

python : Generate avro schema using pandavro invalid datatype64[ns]

MySQL根据两列对数据进行分类

Javascript 浏览器乱序执行代码

javascript - 如何防止在 Chrome 中发送 Origin HTTP header ?

javascript - 我可以在 asp.net-mvc 3 中的 @Ajax.Actionlink 中传递 Javascript 变量吗?