同一时间在一行上的多个 Update 语句
Multiple Update statements on a single row at exactly same time
我有一个场景,我收到一位客户的出租车请求,然后我将取车请求发送给多个 driver。现在想象一下,如果收到请求的 driver 中的两个人同时按下了 "Accept" 按钮,那么哪个 driver 会得到请求。
我乘坐 table 列 ride_id、driver_id、fulfilled(Boolean)。
到目前为止,我正在做的是在按下 "Accept" 按钮后立即调用 API。此 GET 请求 API 检查行程是否已完成。如果是,我会向 driver 显示一条消息,说明行程已经完成,否则我会点击另一个 POST API 请求,将数据库中的已完成值更新为 true 并更新 driver_id.
现在进入我们的场景,当两个 driver 将同时命中 "Accept" 时,将发出两个 GET 请求,并且都将收到 "Not Fulfilled" 作为响应将发送 POST 请求。现在我很困惑谁的数据将在数据库中更新。
我在 back-end 中使用 PHP 和 MYSQL 数据库。
您正在通过 运行 一个 SELECT
,然后一个 UPDATE
创建一个竞争条件。但是所有数据库都可以非常有效地做的一件事是管理并发性。因此,一个更简单的解决方案是 运行 在 driver 点击接受按钮时直接更新,例如:
UPDATE ride
SET driver_id = :driver_id, fulfilled = 1
WHERE ride_id = :ride_id AND fulfilled = 0
然后在您的应用程序中检查记录是否受到查询的影响。如果是,那么这个 driver 赢了。如果没有记录受到影响,则意味着其他 driver 之前接管了行程。
两个驱动程序同时点击接受按钮并不会转化为同时更新一行。你这种情况发生的概率是无限小的。
但是如果真的发生了,不一定是两个事务更新一行的情况。这是一个事务试图更新当前正在更新的行的情况。在任何情况下,当前更新该行的事务都会获得对该行的锁定,并且任何其他试图更新同一行的事务都会排队。
第一个事务完成更新后,它释放锁,队列中其他个事务中的第一个获得锁来执行它自己的更新。这一直持续到等待队列为空。
有趣的是,大多数关系数据库已经内置了此功能,因此您不必担心两个事务同时更新数据库。然而,一个有趣的研究领域是如何在这种情况下管理交易队列(例如,优先等待交易)。
我有一个场景,我收到一位客户的出租车请求,然后我将取车请求发送给多个 driver。现在想象一下,如果收到请求的 driver 中的两个人同时按下了 "Accept" 按钮,那么哪个 driver 会得到请求。
我乘坐 table 列 ride_id、driver_id、fulfilled(Boolean)。
到目前为止,我正在做的是在按下 "Accept" 按钮后立即调用 API。此 GET 请求 API 检查行程是否已完成。如果是,我会向 driver 显示一条消息,说明行程已经完成,否则我会点击另一个 POST API 请求,将数据库中的已完成值更新为 true 并更新 driver_id.
现在进入我们的场景,当两个 driver 将同时命中 "Accept" 时,将发出两个 GET 请求,并且都将收到 "Not Fulfilled" 作为响应将发送 POST 请求。现在我很困惑谁的数据将在数据库中更新。
我在 back-end 中使用 PHP 和 MYSQL 数据库。
您正在通过 运行 一个 SELECT
,然后一个 UPDATE
创建一个竞争条件。但是所有数据库都可以非常有效地做的一件事是管理并发性。因此,一个更简单的解决方案是 运行 在 driver 点击接受按钮时直接更新,例如:
UPDATE ride
SET driver_id = :driver_id, fulfilled = 1
WHERE ride_id = :ride_id AND fulfilled = 0
然后在您的应用程序中检查记录是否受到查询的影响。如果是,那么这个 driver 赢了。如果没有记录受到影响,则意味着其他 driver 之前接管了行程。
两个驱动程序同时点击接受按钮并不会转化为同时更新一行。你这种情况发生的概率是无限小的。
但是如果真的发生了,不一定是两个事务更新一行的情况。这是一个事务试图更新当前正在更新的行的情况。在任何情况下,当前更新该行的事务都会获得对该行的锁定,并且任何其他试图更新同一行的事务都会排队。
第一个事务完成更新后,它释放锁,队列中其他个事务中的第一个获得锁来执行它自己的更新。这一直持续到等待队列为空。
有趣的是,大多数关系数据库已经内置了此功能,因此您不必担心两个事务同时更新数据库。然而,一个有趣的研究领域是如何在这种情况下管理交易队列(例如,优先等待交易)。