트랜잭션¶
CodeIgniter의 데이터베이스 추상화를 사용하면 트랜잭션 안전 테이블 유형을 지원하는 데이터베이스와 함께 트랜잭션을 사용할 수 있습니다. MySQL에서는 더 일반적인 MyISAM 대신 InnoDB 또는 BDB 테이블 유형을 사용해야 합니다. 대부분의 다른 데이터베이스 플랫폼은 기본적으로 트랜잭션을 지원합니다.
트랜잭션에 익숙하지 않다면 특정 데이터베이스에 대한 좋은 온라인 자료를 찾아 공부하는 것을 권장합니다. 아래 정보는 트랜잭션에 대한 기본적인 이해가 있다고 가정합니다.
CodeIgniter의 트랜잭션 접근 방식¶
CodeIgniter는 인기 있는 데이터베이스 클래스 ADODB에서 사용하는 프로세스와 매우 유사한 트랜잭션 접근 방식을 사용합니다. 트랜잭션 실행 프로세스를 크게 단순화하기 때문에 이 접근 방식을 선택했습니다. 대부분의 경우 두 줄의 코드만 필요합니다.
전통적으로 트랜잭션은 쿼리를 추적하고 쿼리의 성공 또는 실패에 따라 커밋 또는 롤백 여부를 결정해야 하기 때문에 구현하는 데 상당한 작업이 필요했습니다. 이는 중첩된 쿼리에서 특히 번거롭습니다. 반면에 이 모든 것을 자동으로 처리하는 스마트 트랜잭션 시스템을 구현했습니다 (원하는 경우 트랜잭션을 수동으로 관리할 수 있지만 실제로 이점은 없습니다).
트랜잭션 실행¶
트랜잭션을 사용하여 쿼리를 실행하려면 다음과 같이 $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 모드¶
기본적으로 CodeIgniter는 모든 트랜잭션을 Strict 모드로 실행합니다. Strict 모드가 활성화되면 여러 트랜잭션 그룹을 실행할 때 하나의 그룹이 실패하면 모든 그룹이 롤백됩니다. Strict 모드가 비활성화되면 각 그룹이 독립적으로 처리되므로 한 그룹의 실패가 다른 그룹에 영향을 미치지 않습니다.
Strict 모드는 다음과 같이 비활성화할 수 있습니다:
$this->db->trans_strict(FALSE);
에러 관리¶
config/database.php 파일에서 에러 보고가 활성화되어 있으면 커밋이 실패할 경우 표준 에러 메시지가 표시됩니다. 디버깅이 꺼진 경우 다음과 같이 자체 에러를 관리할 수 있습니다:
$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)
{
// 에러를 생성하거나... log_message() 함수를 사용하여 에러를 기록합니다
}
트랜잭션 비활성화¶
트랜잭션을 비활성화하려면 $this->db->trans_off()를 사용할 수 있습니다:
$this->db->trans_off();
$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
트랜잭션이 비활성화되면 쿼리는 트랜잭션 없이 실행할 때와 마찬가지로 자동 커밋되며,
trans_start(), trans_complete() 등의 호출은 무시됩니다.
테스트 모드¶
선택적으로 트랜잭션 시스템을 “테스트 모드”로 설정할 수 있습니다. 이 경우 쿼리가 유효한 결과를 생성하더라도 롤백됩니다. 테스트 모드를 사용하려면 $this->db->trans_start() 함수의 첫 번째 매개변수를 TRUE로 설정하세요:
$this->db->trans_start(TRUE); // 쿼리가 롤백됩니다
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();
트랜잭션 수동 실행¶
트랜잭션을 수동으로 실행하려면 다음과 같이 할 수 있습니다:
$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();
}
참고
수동 트랜잭션을 실행할 때는 $this->db->trans_start()가 아닌 $this->db->trans_begin()을 사용해야 합니다.