목차

트랜잭션 가이드

개요

트랜잭션이란

Kantukan ERP 에서의 트랜잭션

사용법

사용 범위

트랜잭션은 특성 상 Business layer (Model)에서만 활용 가능 (기술적으로는 다른 layer에서도 활용 가능하나 해당 프로젝트를 포함한 일반적인 프로젝트에서는 보통 금지합니다.)

자동 트랜잭션

자동 트랜잭션이란 commit, rollback 을 프레임웍에서 자동으로 결정하여 진행하는 트랜잭션 방식이다.

트랜잭션 시작

트랜잭션 시작 시 관련 datasource 이름을 지정할 수 있다 (미 지정시, default 활용)

트랜잭션 종료

트랜잭션 종료도 시작과 마찬가지로 datasource 이름 지정이 가능하며 미 지정시 역시 default 를 사용한다.

트랜잭션 결과 자동 판별 규칙

트랜잭션 시작과 종료 중의 쿼리 - 동일 datasource 를 활용하는 - 중에 오류가 없을 시 자동으로 commit이 진행된다.

예)

소스 상에서의 트랜잭션 결과 확인 방법

트랜잭션 종료 시 return 값(true, false)을 통해 트랜잭션의 결과를 확인 할 수 있다.

사용 예제

/**
 * KTK_Model 을 extends한 model에서만 공용 트랜잭션 활용 가능
 * controller 등에서 트랜잭션 사용 금지
 */
class Prototype_model extends KTK_Model {
  /**
   * 트랜잭션 테스트 method
   */ 
  function transTest($paramArr=null) {
  /** 1. 트랜잭션 시작 선언 */
  $this->transStart();
    foreach ( $paramArr as $param) {
      $this->query("insertTestTable", array('param'=>$param)); // insert 쿼리 수행
    }
    // 업데이트의 경우는 대상 ROW 가 없어도 transaction 은 성공 (쿼리는 성공했기 때문)
    $this->query("updateTestTable");
 
    /** 2. 트랜잭션 종료 선언 (이 때 commit / rollback 이 이루어진다) */
    $result = $this->transEnd(); // $this->transComplete(); 로도 활용 가능하다
 
    /** 3. 결과 확인 및 분기처리 */
    if ( $result === true ) { /** 트랜잭션 성공 케이스 */ }
    else { /** 트랜잭션 실패 케이스 */ }
  }
}

수동 트랜잭션

수동 트랜잭션이란 commit, rollback 을 프레임웍이 아닌 개발자가 소스 상에서 직접 정의하여 결정하는 트랜잭션 방식이다.

사용 예제

/**
 * KTK_Model 을 extends한 model에서만 공용 트랜잭션 활용 가능
 * controller 등에서 트랜잭션 사용 금지
 */
class Prototype_model extends KTK_Model {
  /**
   * 매뉴얼 트랜잭션 테스트 method
   */ 
  function transTest($paramArr=null) {
  /** 1. 매뉴얼 트랜잭션 시작 선언 */
  $this->manualTransStart();
    foreach ( $paramArr as $param) {
      $this->query("insertTestTable", array('param'=>$param)); // insert 쿼리 수행
    }
    $this->query("updateTestTable");
 
    /** 2. 결과 확인 */
    $result = $this->getTransStatus(); // 해당 호출을 통해 자동 트랜잭션과 같은 조건 판단이 가능하다, 그러나 매뉴얼인 만큼 UPDATE ROW수 혹은 기타 조건을 통한 분기 처리가 가능하다.
 
    if ( $result === true ) { 
      /** 트랜잭션 성공 케이스 */
      // 앞의 null은 datasource name 이다, null일 경우 default
      $this->transEnd(null, true); // $this->transCommit(); 과 동일
 
    } else { 
      /** 트랜잭션 실패 케이스 */
      // 앞의 null은 datasource name 이다, null일 경우 default
      $this->transEnd(null, false); // $this->transRollback(); 과 동일
    }
  }
}

주의사항

트랜잭션의 유지 속성

여러 Model 에서 트랜잭션을 유지하는 방법

 /**
  * DB Pool을 보유하고 있는 모델에서 신규 생성된 모델로 DB Pool 동기화
  * $this : DB Pool을 보유하고 있는 Model의 인스턴스
  * $insTargetModel :DB Pool을 받을 Model의 인스턴스
  */
$this->linkDBPoolTo($insTargetModel);

트랜잭션이 유지되지 않는 경우