php - 同一行上的多个 Update 语句
问题描述
我有一个场景,我从客户那里收到了出租车请求,然后我向多个司机发送了取货请求。现在想象一下,如果两个收到请求的司机同时点击“接受”按钮,那么哪个司机会搭车。
我有一个包含ride_id、driver_id、已完成(布尔)列的乘车表。
到目前为止,我正在做的是在点击“接受”按钮后立即调用 API。此 GET 请求 API 检查行程是否已完成。如果是,我会向司机显示一条消息,说乘车已经完成,否则我会点击另一个 POST API 请求,它将 DB 中的已完成值更新为 true,并更新 driver_id。
现在进入我们的场景,当两个驱动程序同时点击“接受”时,将发出两个 GET 请求,并且两者都将得到“未完成”作为响应,此后两者都将发送一个 POST 请求。现在我很困惑谁的数据将在数据库中更新。
我在后端使用 PHP 和 MYSQL 作为数据库。
解决方案
您正在通过运行 a 来创建竞争条件SELECT
,然后运行UPDATE
. 但是所有数据库都可以非常有效地做的一件事是管理并发性。因此,更简单的解决方案是在驱动程序点击接受按钮时直接运行更新,例如:
UPDATE ride
SET driver_id = :driver_id, fulfilled = 1
WHERE ride_id = :ride_id AND fulfilled = 0
然后在您的应用程序中检查记录是否受到查询的影响。如果是,那么这个司机就赢了。如果没有记录受到影响,则意味着之前有其他司机接管了该行程。
推荐阅读
- python-3.x - 迭代数据框的行并创建一个新的数据框
- macos - 如何打开新终端并在新终端中运行命令?
- javascript - 字符串修剪:while 循环与二进制搜索的性能?
- python - 基于dict中相同键的值求和并生成数组
- hdf5 - 通过类文件对象访问数据时,h5py 执行许多小读取
- angular - Angular 12 + webpack 5 + AOT 构建 - 无法生成 ngfactory 文件
- mongodb - 尽管连接成功,猫鼬 docker CRUD 仍无法正常工作
- html - 我可以在 svg 剪辑路径上设置固定宽度和高度吗?
- firebase - 如何解决 Firebase 中动态链接的 URL 前缀问题?
- python - 为什么这个关于字典的 Python 片段有效?