트랜잭션이란
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(); 과 동일 } } }
/** * DB Pool을 보유하고 있는 모델에서 신규 생성된 모델로 DB Pool 동기화 * $this : DB Pool을 보유하고 있는 Model의 인스턴스 * $insTargetModel :DB Pool을 받을 Model의 인스턴스 */ $this->linkDBPoolTo($insTargetModel);