BEGIN¶
현재 세션에서 트랜잭션을 시작합니다.
START TRANSACTION은 BEGIN의 동의어입니다.
- 참고 항목:
COMMIT , ROLLBACK , SHOW TRANSACTIONS , DESCRIBE TRANSACTION
구문¶
BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]
START TRANSACTION [ NAME <name> ]
매개 변수¶
WORK | TRANSACTION
다른 데이터베이스 시스템과의 호환성을 제공하는 선택적 키워드입니다.
NAME name
트랜잭션에 이름을 지정하는 선택적 문자열입니다. 이름은 트랜잭션을 식별하는 데 도움이 되지만 필수 사항은 아니며 고유할 필요도 없습니다.
사용법 노트¶
모든 트랜잭션에는 시스템에서 생성되는 내부 ID가 있습니다. 트랜잭션 ID는 부호 있는 64비트(long) 정수입니다. 값의 범위는 -9,223,372,036,854,775,808(-2 63)~9,223,372,036,854,775,807(2 63 - 1)입니다.
트랜잭션의 이름을 지정하는 경우
NAME
키워드가 필요합니다.이름을 지정하지 않으면 시스템에서 생성되는 이름이 트랜잭션에 할당됩니다.
트랜잭션을 완료하려면 COMMIT 또는 ROLLBACK 명령을 명시적으로 실행해야 합니다. 이러한 명령 중 하나가 실행될 때까지 트랜잭션은 열린 상태로 유지됩니다.
명시적 트랜잭션에서 SQL 문이 스트림을 쿼리하는 경우, 스트림은 문이 실행될 때가 아닌 트랜잭션이 시작될 때 스트림 이동 지점(즉, 타임스탬프)에서 쿼리됩니다. 이 동작은 새 테이블을 기존 스트림의 행으로 채우는 DML 문과 CREATE TABLE … AS SELECT(CTAS) 문에 모두 적용됩니다.
한 행에서 두 BEGIN 문이 (똑같은 범위 내에서) 실행될 경우 두 번째 문은 무시됩니다. 예를 들어, 다음 코드에서 두 번째와 세 번째 BEGINs은 아무런 효과가 없으며 기존에 열린 트랜잭션이 계속됩니다.
begin; begin; -- Ignored! insert into table1 ...; begin; -- Ignored! insert into table2 ...; commit;
자율 범위 지정 트랜잭션과 저장 프로시저 를 사용 중이라면 규칙이 더 복잡할 수 있습니다.
예¶
트랜잭션 시작:
BEGIN; SHOW TRANSACTIONS; +---------------+--------+--------------+--------------------------------------+-------------------------------+---------+ | id | user | session | name | started_on | state | |---------------+--------+--------------+--------------------------------------+-------------------------------+---------| | 1530042321085 | USER1 | 223347060798 | 56cb9163-77a3-4223-b3e0-aa24a20540a3 | 2018-06-26 12:45:21.085 -0700 | running | +---------------+--------+--------------+--------------------------------------+-------------------------------+---------+ SELECT CURRENT_TRANSACTION() +-----------------------+ | CURRENT_TRANSACTION() | |-----------------------| | 1530042321085 | +-----------------------+트랜잭션에 대해 시스템에서 할당한 이름인
56cb9163-77a3-4223-b3e0-aa24a20540a3
을 확인합니다.
지정된 이름으로 트랜잭션 시작:
BEGIN NAME T1; SHOW TRANSACTIONS; +---------------+--------+--------------+------+-------------------------------+---------+ | id | user | session | name | started_on | state | |---------------+--------+--------------+------+-------------------------------+---------| | 1530042377426 | USER1 | 223347060798 | T1 | 2018-06-26 12:46:17.426 -0700 | running | +---------------+--------+--------------+------+-------------------------------+---------+ SELECT CURRENT_TRANSACTION(); +-----------------------+ | CURRENT_TRANSACTION() | |-----------------------| | 1530042377426 | +-----------------------+
이전 예와 똑같지만, BEGIN 대신 START TRANSACTION 사용:
START TRANSACTION NAME T2; SHOW TRANSACTIONS; +---------------+--------+--------------+------+-------------------------------+---------+ | id | user | session | name | started_on | state | |---------------+--------+--------------+------+-------------------------------+---------| | 1530042467963 | USER1 | 223347060798 | T2 | 2018-06-26 12:47:47.963 -0700 | running | +---------------+--------+--------------+------+-------------------------------+---------+ SELECT CURRENT_TRANSACTION(); +-----------------------+ | CURRENT_TRANSACTION() | |-----------------------| | 1530042467963 | +-----------------------+