2017-04-26 1 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 업데이트를 모두 롤백하고 싶습니까?"

두 가지 작업간에 일관성을 유지해야하거나 두 번째 작업이 실패 할 경우 다시 시도해야하며 모든 작업을 다시 수행하는 것이 프로세스의 위치를 ​​찾는 것보다 쉽습니다 방해해서 (당신이 거기에서 다시 시작할 수 있도록).

관련 문제