2017-04-26 99 views
0

我嘗試了一些新的東西,每當我有多個查詢插入/更新時,我的一端。我爲此使用數據庫事務。多個查詢的數據庫事務

$this->transaction->beginTransaction(); 

try { 

    $trucker_user->update([ 
     'username'  => $request->getParam('username'), 
     'first_name'  => $request->getParam('first_name'), 
     'middle_name' => $request->getParam('middle_name'), 
     'last_name'  => $request->getParam('last_name'), 
     'contact_number' => $request->getParam('contact_number'), 
     'email'   => $request->getParam('email'), 
     'status'   => ($trucker_id) ? 1 : $request->getParam('status') 
    ]); 

    if ($trucker_id === false) { 
     $trucker_user->userTrucker()->update([ 
      'trucker_id' => $request->getParam('trucker_id') 
     ]); 
    } 

    $this->transaction->commit(); 
} catch(\Exception $e) { 
    $this->transaction->rollBack(); 
    throw $e; 
} 

因此問題是,是不是當我有一個插入/更新我應該使用數據庫事務爲它的多個查詢一個好的做法呢?

我知道有一個事務是一個好主意,當事情發生不良時它會回滾。但是,每當我使用它總是在多個查詢是不是有點矯枉過正?

回答

1

該交易是爲保證一致性而設計的工具。如果第一次更新/插入操作在第二次更新/插入操作失敗時應該回滾,則需要事務。

在您的示例中,您更新了trucker_user的字段,然後在某些情況下更新了其id。您應該對自己構成的問題是「如果id更新失敗,我是否想要回滾所有trucker_user更新?」

答案可能是肯定的,要麼是因爲您必須保持兩個操作之間的一致性,要麼是因爲在第二次操作失敗的情況下,您必須重試它,並且再次做所有事情都比找到過程的位置更容易中斷(以便你可以從那裏開始)。