BEGIN
BEGIN
현재 세션에서 트랜잭션(transaction)을 시작하는 명령이에요. START TRANSACTION은 BEGIN의 동의어예요.
출처: 문서
본문
관련 명령: COMMIT, ROLLBACK, SHOW TRANSACTIONS, DESCRIBE TRANSACTION
구문 (Syntax)
BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]
START TRANSACTION [ NAME <name> ]
매개변수 (Parameters)
WORK | TRANSACTION — 다른 데이터베이스 시스템과의 호환성을 제공하는 선택적 키워드예요.
NAME name — 트랜잭션에 이름을 할당하는 선택적 문자열이에요. 이름은 트랜잭션을 식별하는 데 도움이 되지만 필수는 아니며 고유할 필요도 없어요.
사용 메모 (Usage notes)
- 모든 트랜잭션에는 시스템 생성 내부 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 문이 명시적 트랜잭션 내에서 스트림(stream)을 쿼리하면, 스트림은 문이 실행된 시점이 아니라 트랜잭션이 시작된 시점의 스트림 진행 지점(즉 타임스탬프)에서 쿼리돼요. 이 동작은 DML 문과 기존 스트림의 행으로 새 테이블을 채우는 CREATE TABLE … AS SELECT (CTAS) 문 모두에 적용돼요.
- 같은 범위 내에서 두 개의 BEGIN 문이 연속으로 실행되면 두 번째 문은 무시돼요. 예를 들어 다음 코드에서 두 번째와 세 번째 BEGIN은 효과가 없으며, 기존 열린 트랜잭션이 계속돼요.
BEGIN;
BEGIN; -- Ignored!
INSERT INTO table1 ...;
BEGIN; -- Ignored!
INSERT INTO table2 ...;
COMMIT;
자율 범위 트랜잭션과 저장 프로시저를 사용하면 규칙이 더 복잡해질 수 있어요.
예시 (Examples)
참고: 이 예시들은 트랜잭션을 완료하는 데 필요한 명령을 포함하지 않아요. 완전한 트랜잭션 예시는 COMMIT 또는 ROLLBACK을 참고하세요.
트랜잭션을 시작해요.
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 |
+-----------------------+
더 알아보기 (Learn more)
- COMMIT — 트랜잭션 커밋
- ROLLBACK — 트랜잭션 롤백
- SHOW TRANSACTIONS — 트랜잭션 나열