트랜잭션(Transactions)

CodeIgniter는 트랜잭션을 지원하는 데이터베이스를 사용할 때 트랜잭션을 사용하도록 지원합니다. MySQL 을 사용하신다면, 일반적인 MyISAM 보다는 InnoDB 나 BDB 를 사용하셔야 트랜잭션기능을 이용할 수 있습니다. 대부분의 다른 데이터베이스 시스템들은 기본적으로 내장된 트랜잭션기능이 있습니다.

트랜잭션에 익숙하지 않으시다면 인터넷에서 사용하시는 데이터베이스의 트랜잭션에 대한 정보를 먼저 찾아보세요. 지금 부터 제공하는 정보는 당신이 트랜잭션에 대해 어느 정도 알고 있다고 가정하고 있습니다.

CodeIgniter 의 트랜잭션 접근법 CodeIgniter’s Approach to Transactions

CodeIgniter 의 트랜잭션 접근법은 유명한 데이터베이스 클래스인 ADODB와 매우 유사합니다. 우리가 이 접근법을 사용한 이유는 그 클래스가 트랜잭션을 실행 과정을 대단히 단순화하기 때문입니다. 대부분의 경우에 겨우 2줄 정도의 코드가 필요합니다.

전통적인 방법에 있어서는 트랜잭션을 사용하기 위해서 해야할 일이 많습니다. 쿼리의 결과에 따라 커밋 할지 롤벡할지를 결정하기 위해서 계속 쿼리를 추적해야하기 때문입니다. 여러 쿼리를 동시에 실행해야할 때 이건 정말 귀찮은 일이죠 . 이에 반해, 우리는 이 모든 것을 자동으로 수행해줄 똑똑한 트랜잭션 시스템을 만들었습니다.(물론 여러분이 직접 트랜잭션을 수동으로 처리할 수도 있지만, 그럴 필요가 전혀 없습니다).

트랜잭션의 실행 Running Transactions

트랜잭션을 이용하여 쿼리를 실행하려면 $this->db->trans_start() 함수와 $this->db->trans_complete() 함수를 아래와 같이 사용합니다:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');
$this->db->trans_complete();

start/complete 함수 사이에 원하는 수 만큼의 쿼리를 실행하면 전체의 성공 여부에 따라 함수들이 알아서 커밋 혹은 롤백을 수행합니다.

완벽모드 Strict Mode

기본적으로 CodeIgniter 는 트랜잭션을 완벽모드(Strict Mode)로 실행합니다. 완벽모드가 활성화된 상태에서는 여러 그룹의 트랜잭션을 실행했을 때 단 하나라도 실패하게되면 전체는 롤백됩니다. 만약 완벽모드가 비활성화라면, 여러그룹의 트랜잭션을 실행했을 때 각각의 그룹은 독립적으로 실행되기 때문에 각 그룹내에서만 성공 여부에 따라서 커밋, 롤백하게 됩니다. 즉 그룹간에는 서로 영향이 없습니다.

완벽모드는 아래와 같은 방법으로 비활성화 시킬 수 있습니다:

$this->db->trans_strict(FALSE);

관리에러 Managing Errors

만약 config/database.php 파일에서 에러 리포팅을 활성화 시켜두었다면, 커밋이 실피했을 때 표준 에러 메세지를 출력합니다. 만약 디버깅이 off 상태라면, 아래와 같이 수동으로 에러를 관리할 수 있습니다:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
        // generate an error... or use the log_message() function to log your error
}

트랜잭션 활성화 Enabling Transactions

$this->db->trans_start() 함수를 호출하면 트랜잭션은 자동으로 활성화 됩니다. 트랜잭션을 비활성화 시키고 싶다면, $this->db->trans_off() 함수를 호출하시면 됩니다:

$this->db->trans_off();

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

트랜잭션이 비활성화 되면, 쿼리는 트랜잭션 없이 실행할 때와 마찬가지로 자동 커밋됩니다.

테스트 모드 Test Mode

트랜잭션을 “test mode” 로 하면 쿼리는 정상적인 결과를 생성하더라도 모두 롤백됩니다. 테스트모드를 이용하려면, $this->db->trans_start() 함수의 첫 번째 파라미터를 TRUE로 하시면 됩니다:

$this->db->trans_start(TRUE); // Query will be rolled back
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

트랜잭션 수동으로 수행하기 Running Transactions Manually

아래와 같은 방법으로 트랜잭션을 수동처리 할 수 있습니다:

$this->db->trans_begin();

$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');

if ($this->db->trans_status() === FALSE)
{
        $this->db->trans_rollback();
}
else
{
        $this->db->trans_commit();
}

Note

수동 트랜잭션시에는 $this->db->trans_begin() 함수를 사용해야 합니다. $this->db->trans_start() 함수를 사용하지 않도록 주의하세요.