我有一個名為 的表cards,每個用戶可以創建/擁有多張卡片。其中一張卡必須設定為默認值。
有時當用戶同時執行多個請求將另一張卡設定為默認卡時,最終會出現兩張或更多張默認卡。
初始表:
| ID | 用戶身份 | is_default |
|---|---|---|
| 1 | 50 | 0 |
| 2 | 50 | 1 |
請求(同時執行):
PATCH http://localhost:8000/cards/1/default
PATCH http://localhost:8000/cards/2/default
結果:
兩者都設定為默認值。
| ID | 用戶身份 | is_default |
|---|---|---|
| 1 | 50 | 1 |
| 2 | 50 | 1 |
代碼:
use App\Models\Card;
public function setAsDefault(Request $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]);
return ['status' => true'];
}
可能的解決方案:
- 帶有共享鎖的事務
- 限速
還有其他更簡單的解決方案嗎?
uj5u.com熱心網友回復:
嘗試使用事務。像這樣的東西...
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]);
});
幾乎所有高負載應用程式都需要事務機制來使“資料庫更改”原子化。
uj5u.com熱心網友回復:
您可以嘗試更改更新代碼。
在第一個設定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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365233.html
下一篇:根據日期和時間顯示日期
