使用 Laravel 作為我的后端,我想通過控制器將資料添加到我的資料庫中。為此,我需要做兩件事:
驗證資料并使用函式A將資料插入到tableA中。函式A回傳接收到的id
更新用戶使用函式 B 提交 tableB 中的資料。tableB 通過 tableA->id 與 tableA 相關。
我希望上面的兩個步驟在資料庫事務中運行。例如,如果更新 tableB 時出現錯誤,理想情況下應該回滾 tableA。我覺得這樣最有道理?
但是,如果 functionA 因為需要驗證資料而不必要地長,例如這里:
public function A($data) {
// get data constraints from tableC (a get query)
// verify data against constraints stated in tableC (assume this step is long)
// insert data into tableA
// return row Id.
}
public function B($userId, $rowId) {
// update tableB where userId = $userId with $rowId.
}
public function controller(Request $request) {
DB::transaction(function() use ($request) {
$newId = A($request->data);
B($request->userId, $newId);
});
}
據我了解,這并不理想。因為函式 A 會占用事務時間來執行其他操作,例如查詢表和執行回圈以驗證資料。
這導致不必要的作業量被包含在 DB::transaction 中。
我想知道這真的是一件壞事嗎?DB::transaction 是否以可以優化任何表鎖定的方式實作?
我將無法輕易更改邏輯結構,因為函式 A 和函式 B 屬于兩個不同的類。
編輯:如果我真的想要,我實際上可以更改邏輯,但是現在我更感興趣的是這是否真的是使用 DB::transaction 的問題。
因為現在我什至不確定 DB::transaction 是否會為整個函式鎖定表。
uj5u.com熱心網友回復:
DB::transaction不鎖定表。只有當塊內拋出例外時,它才會回滾更改。
欲了解更多資訊:https ://laravel.com/docs/9.x/database#database-transactions
如果你想鎖定表,你可以使用這個問題的答案:如何用 Laravel 鎖定表?
DB::raw('LOCK TABLES important_table WRITE');
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428466.html
下一篇:獲取多維陣列的鍵(PHP語言)
