簡體   English   中英

在 DB::transaction in PHP Laravel 中使用 long function 有什么缺點嗎?

[英]Are there any downsides of using a long function in DB::transaction in PHP Laravel?

使用 Laravel 作為我的后端,我想通過 controller 將數據添加到我的數據庫中。為此我需要做兩件事:

  1. 驗證數據並使用 function A 將數據插入 tableA。Function A 返回收到的 id

  2. 更新用戶使用 function 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);
    });
}

據我了解,這並不理想。 因為 function A 會占用事務時間來做其他事情,例如查詢表和執行循環以驗證數據。

這會導致不必要的工作量被包含在 DB::transaction 中。

我想知道這真的是一件壞事嗎? DB::transaction 是否以可以優化任何表鎖定的方式實現?

我無法輕易更改邏輯結構,因為 function A 和 function B 屬於兩個不同的類。

編輯:如果我真的想的話,我實際上可以改變邏輯,但是現在我更感興趣的是這是否真的是使用 DB::transaction 的問題。

因為現在我什至不確定 DB::transaction 是否鎖定了整個 function 的表。

DB::transaction不鎖定表。 只有當塊內拋出異常時,它才會回滾更改。

更多信息: https://laravel.com/docs/9.x/database#database-transactions

如果你想鎖定表,你可以使用這個問題的答案: How to lock table with Laravel?

DB::raw('LOCK TABLES important_table WRITE');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM