具有多个更新的竞争条件 PHP 和 MySQL



我有一个名为cards的表,每个用户可以创建/拥有多张卡。其中一张卡必须设置为默认卡
有时,当用户同时执行多个请求将另一张卡设置为默认卡时,最终会出现两张或多张默认卡。

初始表格:

<1>
id user_id is_default
1 50
2 50

尝试使用事务。像这样的。。。


DB::transaction(function() use ($request, $id) {
Card::where('user_id', $request->user()->id)
->update(['is_default' => false]);

Card::where([
'id' => $id,
'user_id' => $request->user()->id
])->update(['is_default' => true]);

});

几乎所有的高负载应用程序都需要交易机制;数据库改变";原子的

您可以尝试更改代码以进行更新。

在默认卡的第一组is_default = 1中。

在第二组is_default = 0中,其他卡不包括默认卡。

不知道如何使这是你的"框架";但在SQL中,它应该通过两个查询例如,将id为1的卡设置为默认

UPDATE cards SET is_default = 1 WHERE user_id = 50 AND id = 1;
UPDATE cards SET is_default = 0 WHERE user_id = 50 AND id <> 1;

最新更新