CodeIgniter User Guide Version 2.1.0


트랜잭션(Transactions)

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

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

CodeIgniter 의 트랜잭션 접근법

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()함수를 사용하지 않도록 주의하세요.