我仍然对表行锁定感到困惑。我正在使用 MySQL/PHP,这是我的场景。
我有一组表,我的应用程序使用这些表来跟踪请求和帖子。用户为项目(表 ITEM (I))创建发布(表 POSTING (P))并且可以向单个用户发送请求(表 REQUEST (R))或者可以发布它并接收发布响应(表 POSTING_RESPONSE (PR )) 将被用户发布项目接受。
示例:我是骑自行车的用户。我发布它 - 并向个人用户发送请求。收到我的请求的用户可以接受/拒绝/或什么都不做。如果他们接受 - 它被保留。其他用户可以找到我的帖子并“申请”项目。我有能力“接受”或“忽略”他们的要求。如果我接受,则保留项目。
如果有人接受请求,我想做什么:
锁定ITEM(I)表中item对应的行
锁定 POSTING (P) 表中与项目对应的行(如果存在行)
为项目发送的任何请求锁定 REQUEST (R) 表中的行
锁定与项目对应的 POSTING_RESPONSE (PR) 表中的行(如果存在行)
将项目状态更新为“已保留”
将 POSTING 状态更新为“不可用”
将所有/任何 POSTING_RESPONSE 更新为“拒绝”
将所有请求更新为“已拒绝”,除了已接受的请求 - 将该请求更新为“已接受”
请忽略此示例的冗余状态。
现在,我假设 #1 - 4 可以通过简单的“选择...进行更新”来完成,而将 AUTOCOMMIT 设置为 false。我可以用这些选择语句来确定我是否应该更新——如果是这样,我可以继续更新。然后在完成更新 #5-8 后,我将提交并解锁行。
我在让它工作时遇到问题,我不知道是因为我正在做的事情还是我的想法不正确。
还有一件事......还有其他进程可以将项目的状态更新为,例如,EXPIRED 或 CANCELLED。我希望我的方法的唯一解决方案不是将每个可能的条件都放在 UPDATE 语句中的 WHERE 子句中……这不容易维护。