다음을 통해 공유


트랜잭션 시작

적용 대상:'예'로 체크 표시됨 Databricks SQL

여러 SQL 문을 커밋하거나 롤백할 수 있는 단일 작업 단위로 그룹화하는 새로운 대화형 트랜잭션을 시작합니다.

대화형 트랜잭션의 대안으로, BEGIN ATOMIC ... END; 구문을 사용하여 비대화형 트랜잭션을 정의할 수 있습니다. ATOMIC 복합 문을 참조하세요.

문법

BEGIN { TRANSACTION | WORK }

매개 변수

이 문에는 매개 변수가 없습니다.

Notes

  • 인터랙티브 트랜잭션이 이미 활성화된 상태에서 BEGIN TRANSACTION를 다시 실행하면 TRANSACTION_NOT_SUPPORTED.NESTED_TRANSACTION 오류가 발생합니다. 대화형 트랜잭션은 중첩을 지원하지 않습니다.
  • BEGIN TRANSACTIONBEGIN WORK 동일한 구문 대안입니다.

예제

다음 예제에서는 일반적인 대화형 트랜잭션 패턴을 보여 줍니다.

기본 테이블 간 트랜잭션

각 문을 개별적으로 실행합니다.

BEGIN TRANSACTION;
-- Insert a new record
INSERT INTO my_table VALUES (1, 'test');
-- Update records in another table
UPDATE another_table
SET value = 'updated'
WHERE id = 5;
-- Commit all changes in both tables atomically
COMMIT TRANSACTION;

자신의 쓰기 즉시 읽기

각 문을 개별적으로 실행합니다.

BEGIN TRANSACTION;
-- Insert new data
INSERT INTO customers VALUES (101, 'New Customer');
-- Query can see the inserted data within the same transaction
SELECT * FROM customers WHERE id = 101;
-- Returns the newly inserted row even though it's not yet committed
-- Update the newly inserted data
UPDATE customers SET name = 'Updated Customer Name' WHERE id = 101;
-- Query sees the updated value
SELECT name FROM customers WHERE id = 101;
-- Returns 'Updated Customer Name'
-- Commit makes changes visible to other transactions
COMMIT TRANSACTION;

롤백 기능이 있는 트랜잭션

각 문을 개별적으로 실행합니다.

BEGIN TRANSACTION;
-- Attempt an insert operation
INSERT INTO my_table VALUES (1, 'incorrect-value');
-- After discovering the mistake, rollback the transaction
-- (no changes are actually made to the tables)
ROLLBACK TRANSACTION;

커밋되지 않은 변경 내용의 표시 여부

이 예제에서는 트랜잭션이 커밋될 때까지 트랜잭션 내의 변경 내용이 다른 세션에 표시되지 않습니다. 각 문을 개별적으로 실행합니다.

세션 1:

BEGIN TRANSACTION;
-- Insert new data
INSERT INTO products VALUES (999, 'New Product', 29.99);
-- At this point, Session 2 cannot see this data
-- You can see your own changes
SELECT * FROM products WHERE id = 999;
-- Returns the new product

세션 2(동시):

-- This query does not see the uncommitted data from Session 1
SELECT * FROM products WHERE id = 999;
-- Returns no rows

세션 1(계속):

-- Now commit the transaction
COMMIT TRANSACTION;

세션 2(커밋 후):

-- Now the query can see the committed data
SELECT * FROM products WHERE id = 999;
-- Returns the new product

동시 변경 내용 표시 여부

이 예제에서는 트랜잭션 외부에서 수행된 동시 변경 내용이 트랜잭션에 표시되지 않습니다. Azure Databricks는 첫 번째 액세스 시 각 테이블의 일관된 스냅샷을 캡처하며, 해당 테이블의 모든 후속 읽기는 이 스냅샷(반복 가능한 읽기)을 사용합니다. 각 문을 개별적으로 실행합니다.

세션 1 (트랜잭션 시작 및 테이블 읽기):

BEGIN TRANSACTION;
-- Read the table; captures a snapshot of orders at this point
SELECT COUNT(*) FROM orders;
-- Returns: 1

세션 2 (동시 세션이 행을 추가함):

INSERT INTO orders VALUES (2, 'Product B', 75.00);
COMMIT;

세션 1 (계속, 테이블 다시 읽기):

-- Still reads from the original snapshot; the new row is not visible
SELECT COUNT(*) FROM orders;
-- Returns: 1 (unchanged, even though Session 2 committed a new row)
COMMIT;

이렇게 하면 동시 수정에 관계없이 트랜잭션 전체에서 일관된 읽기가 보장됩니다.

  • ATOMIC 복합 문(비대화형 트랜잭션): 자동 커밋 및 롤백을 사용하여 여러 SQL 문을 단일 원자성 트랜잭션으로 실행
  • COMMIT: 대화형 트랜잭션 커밋 및 모든 변경 내용 영구화
  • 롤백: 대화형 트랜잭션 롤백 및 모든 변경 내용 취소
  • 트랜잭션: 트랜잭션 지원, 요구 사항 및 제한 사항 개요
  • 트랜잭션 모드: 비대화형 및 대화형 트랜잭션에 대한 자세한 패턴 및 예제
  • BEGIN END 복합 문: BEGIN ... ENDATOMIC 키워드가 없는 블록들