현재 진행 중인 트랜잭션에 대해서 커밋(commit)이나 롤백(rollback)을 수행한다. 이때, 열려 있는 요청 핸들은 모두 종료되고, 데이터베이스 서버와 연결이 해제된다. 단, 서버와 연결이 끊어진 후에도 해당 연결 핸들은 유효하며, 이는 cci_connect 함수로 연결 핸들을 하나 할당 받은 경우와 동일한 상태다. type이 CCI_TRAN_COMMIT으로 지정되면 트랜잭션을 커밋하고, CCI_TRAN_ROLLBACK으로 지정되면 트랜잭션을 롤백한다.
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)한 시점에만 자동 커밋이 수행되므로 주의한다. 아래는 이에 관한 예제이다.
$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 완료 -> 자동 커밋
}
}
$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 완료 -> 자동 커밋
}
}
$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는 자동 커밋하지 않음
}
}
$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는 자동 커밋하지 않음
}
}