트랜잭션 커밋

설명

데이터베이스에서 일어난 갱신들은 COMMIT WORK 문이 주어지기 전까지 영구히 저장되지 않는다. "영구히(permanently)" 저장된다는 것은 디스크에 저장이 완료되는 것을 의미한다. 키워드 WORK는 생략이 가능하다. 추가로 데이터베이스의 다른 사용자는 변경이 영구히 반영되기 전까지는 변경 사항을 볼 수 없다. 예를 들어 테이블에 새로운 행을 삽입했을 때 데이터베이스 트랜잭션이 커밋되기 전까지 그 행에 접근할 수 있는 것은 그 행을 삽입한 사용자뿐이다(UNCOMMITTED INSTANCES 격리 수준을 사용하면 다른 사용자가 일관성이 없는 커밋되지 않은 갱신을 볼 수도 있다).

트랜잭션이 커밋된 후에는 트랜잭션에서 획득한 모든 잠금이 해제된다.

구문

[;]COMMIT [ WORK ]

구문 앞에 ;을 붙일 경우 세션 명령어로 간주하여 바로 실행되며 생략할 경우 쿼리문의 하나로 간주하여 ;x[run]을 수행하기 전까지 실행을 보류한다.

예제

아래 예제의 데이터베이스 트랜잭션은 3개의 UPDATE 문으로 구성되는데, 3개의 stadium의 seats 컬럼 값을 변경한다. 결과를 검토하기 위해 갱신이 일어나기 전에 현재의 값과 이름을 검색한다. 기본적으로 csql은 자동으로 autocommit으로 작동되므로, 예제에서는 autocommit 모드를 off로 설정한 후 동작을 시험한다.

;autocommit off

AUTOCOMMIT IS OFF

select name, seats

from stadium where code in (30138, 30139, 30140);

;xrun

=== <Result of SELECT Command in Line 1>===

    name                        seats

==================================

    'Athens Olympic Tennis Centre'         3200

    'Goudi Olympic Hall'         5000

    'Vouliagmeni Olympic Centre'         3400

3 rows selected.

3개의 UPDATE 문은 각각의 stadium의 현재 seats을 가지고 있도록 한다. 명령이 수행되면 정확하게 입력이 되었는지 확인하기 위해 seats 테이블의 관련된 컬럼을 검색할 수 있다.

update stadium

set seats = seats + 1000

where code in (30138, 30139, 30140);

;xrun

3 rows affected.

select name, seats from stadium where code in (30138, 30139, 30140);

;xrun

=== <Result of SELECT Command in Line 1>===

    name                        seats

===================================

    'Athens Olympic Tennis Centre'         4200

   'Goudi Olympic Hall'         6000

    'Vouliagmeni Olympic Centre'         4400

 

3 rows selected.

만약 갱신이 제대로 이루어 졌다면 변경을 영구적으로 만들 수 있다. 이때 아래처럼 COMMIT WORK 문을 사용한다.

;commit work

참고 CUBRID에서는 트랜잭션 관리를 위하여 자동 커밋 모드를 설정할 수 있다. 자동 커밋 모드는 모든 SQL 문을 자동으로 커밋 또는 롤백하는 모드로서, 해당 SQL 문이 정상 수행되면 해당 트랜잭션을 자동 커밋하고, 오류가 발생하면 트랜잭션을 롤백한다. 이러한 자동 커밋 모드는 CUBRID JDBC, ODBC, OLEDB 및 CSQL인터프리터에서 지원되며, CUBRID CCI 및 CUBRID PHP에서는 브로커 파라미터 설정을 통해 SELECT 문에 대해서만 자동 커밋 모드를 적용할 수 있다. 이에 관해서는 브로커별 파라미터에서 SELECT_AUTO_COMMIT의 설명을 참고한다. CSQL 인터프리터에서 자동 커밋 모드를 설정하는 세션 명령어(;AUtocommit)에 대해서는 세션 명령어를 참조한다.