cci_end_tran

설명

현재 진행 중인 트랜잭션에 대해서 커밋(commit)이나 롤백(rollback)을 수행한다. 이때, 열려 있는 요청 핸들은 모두 종료되고, 데이터베이스 서버와 연결이 해제된다. 단, 서버와 연결이 끊어진 후에도 해당 연결 핸들은 유효하며, 이는 cci_connect 함수로 연결 핸들을 하나 할당 받은 경우와 동일한 상태다. typeCCI_TRAN_COMMIT으로 지정되면 트랜잭션을 커밋하고, CCI_TRAN_ROLLBACK으로 지정되면 트랜잭션을 롤백한다.

브로커 파라미터인 CCI_DEFAULT_AUTOCOMMIT으로 응용 프로그램 시작 시 자동 커밋 모드의 기본값을 설정할 수 있으며, 브로커 파라미터 설정을 생략하면 기본값은 ON이다. 응용 프로그램 내에서 자동 커밋 모드를 변경하려면 cci_set_autocommit() 함수를 이용하며, 자동 커밋 모드가 OFF이면 cci_end_tran() 함수를 이용하여 명시적으로 트랜잭션을 커밋하거나 롤백해야 한다.

구문

int cci_end_tran(int conn_handle, char type, T_CCI_ERROR *err_buf)

리턴 값
에러 코드
참고 사항

SELECT 문에 대해서 자동 커밋 모드를 지원하며, 이를 적용하기 위해서는 cubrid_broker.conf 파일에 SELECT_AUTO_COMMIT=ON을 추가해야 한다. 단, 자동 커밋은 prepared statement가 n개인 경우, 서버로부터 n개 질의문 전부에 대해 결과 셋을 가져오기(fetch)한 시점에만 자동 커밋이 수행되므로 주의한다. 아래는 이에 관한 예제이다.

예제 1

$sql1 = "select * from db_user";

$sql2 = "select * from db_class where owner_name = ?";

 

$result = cubrid_execute($con, $sql1);  //select핸들 1개, fetch완료-> 자동 커밋

if ($result) {

  while ($row = cubrid_fetch ($result))

    {

      echo ($row[0]);

 

      $req = cubrid_prepare ($con, $sql2);

      cubrid_bind ($req, 1, $row[0]);

      $res = cubrid_execute ($req);   //select 핸들 1개, fetch 완료 -> 자동 커밋

    }

}

예제 2

$sql1 = "select * from db_user";

$sql2 = "select * from db_class where owner_name = ?";

 

$req = cubrid_prepare ($con, $sql2);

$result = cubrid_execute($con, $sql1);  //select 핸들 2개, 1개만 fetch 완료 -> 자동 커밋하지 않음

if ($result) {

  while ($row = cubrid_fetch ($result))

    {

      echo ($row[0]);

 

      cubrid_bind ($req, 1, $row[0]);

      $res = cubrid_execute ($req);   //모든 select의 fetch 완료 -> 자동 커밋

    }

}

예제 3

$sql1 = "select * from db_user";

$sql2 = "insert into a values (?)";

 

$result = cubrid_execute($con, $sql1);  //select 핸들 1개, fetch 완료 -> 자동 커밋

if ($result) {

  while ($row = cubrid_fetch ($result))

    {

      echo ($row[0]);

 

      $req = cubrid_prepare ($con, $sql2);

      cubrid_bind ($req, 1, $row[0]);

      $res = cubrid_execute ($req);    //insert는 자동 커밋하지 않음

    }

}

예제 4

$sql1 = "select * from db_user";

$sql2 = "insert into a values (?)";

 

$req = cubrid_prepare ($con, $sql2);

$result = cubrid_execute($con, $sql1);  //insert는 fetch가 없으므로 자동 커밋하지 않음

if ($result) {

  while ($row = cubrid_fetch ($result))

    {

      echo ($row[0]);

 

      cubrid_bind ($req, 1, $row[0]);

      $res = cubrid_execute ($req);   //insert는 자동 커밋하지 않음

    }

}