gpt4 book ai didi

php - 行级锁定 - MySQL - 用于更新

转载 作者:行者123 更新时间:2023-11-29 23:29:37 25 4
gpt4 key购买 nike

我仍然对表行锁定感到困惑。我正在使用 MySQL/PHP,这是我的场景。

我的应用程序使用一组表来跟踪请求和帖子。用户为项目(表 ITEM (I))创建过帐(表 POSTING (P)),并且可以向单个用户(表 REQUEST (R))发送请求,或者可以过帐它并接收帖子响应(表 POSTING_RESPONSE (PR )) 将被用户发布项目接受。

示例:我是一名拥有自行车的用户。我发布它 - 并向个人用户发送请求。收到我的请求的用户可以接受/拒绝/或不执行任何操作。如果他们接受 - 则保留。其他用户可以找到我的帖子并“申请”项目。我有能力“接受”或“忽略”他们的请求。如果我接受,该项目将被保留。

如果有人接受请求我想要做什么:

  1. 锁定 ITEM (I) 表中与项目对应的行

  2. 锁定 POSTING (P) 表中与该项目对应的行(如果存在行)

  3. 针对针对项目发送的任何请求,锁定 REQUEST (R) 表中的行

  4. 锁定 POSTING_RESPONSE (PR) 表中与项目对应的行(如果存在行)

  5. 将项目状态更新为“已保留”

  6. 将发布状态更新为“不可用”

  7. 将所有/任何 POSTING_RESPONSE 更新为“已拒绝”

  8. 除了已接受的请求之外,将所有请求更新为“已拒绝” - 将该请求更新为“已接受”

请忽略此示例中的冗余状态。

现在,我假设 #1 - 4 可以通过简单的“选择...进行更新”来完成,而 AUTOCOMMIT 为 false。我可以用这些 select 语句来决定是否应该更新 - 如果是,我可以继续更新。然后在更新 #5-8 完成后,我将提交并且行将被解锁。

我在使其正常工作时遇到问题,我不知道这是因为我正在做的事情还是我的想法不正确。

还有一件事...还有其他进程可以将项目的状态更新为“过期”或“已取消”。我希望我的方法的唯一解决方案不是将每个可能的条件放在 UPDATE 语句中的 WHERE 子句中......这不容易维护。

最佳答案

迷你交易:在一个查询中完成。

UPDATE item
LEFT JOIN posting
ON posting.item_id = item.id -- or however
LEFT JOIN request
ON request.item_id = item.id -- or however
LEFT JOIN posting_reponse
ON posting_response.item_id = item.id
SET
item.status = 'Reserved',
posting.status = 'Unavailable',
posting_reponse.status = 'Rejected',
request.status = IF(request.id = some-current-id,'Accepted','Rejected')
WHERE item.id = some-id AND item.status='Available';

...并且停止询问有关锁定读取的问题,您真的不希望这样:P

关于php - 行级锁定 - MySQL - 用于更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26660335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com