다음을 통해 공유


Transactions

중요합니다

Unity 카탈로그 관리 델타 테이블에 쓰는 트랜잭션은 공개 미리 보기로 제공됩니다.

Unity 카탈로그 관리되는 Iceberg 테이블에 쓰는 트랜잭션은 프라이빗 미리 보기로 제공됩니다. 이 미리 보기에 참가하려면 관리되는 Iceberg 테이블 미리 보기 등록 양식을 제출합니다.

트랜잭션을 사용하면 여러 SQL 문 및 테이블에서 작업을 조정할 수 있습니다. 모든 변경 사항은 함께 성공하거나 함께 롤백되어, 운영 및 테이블 전반에서 데이터 일관성을 보장합니다. 트랜잭션은 원자성, 일관성, 격리 및 내구성과 같은 ACID 보증을 제공합니다. Azure Databricks에서 ACID 보장이란?을 참조하세요. 트랜잭션은 저장 프로시저 및SQL 스크립팅 과 함께 사용하여 중요 업무용 웨어하우징 워크로드를 빌드할 수 있습니다.

다음 예제에서는 트랜잭션을 보여줍니다.

BEGIN ATOMIC
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
  INSERT INTO audit_log VALUES (1, 2, 100, current_timestamp());
END;

세 문장은 모두 함께 커밋됩니다. 명령문이 실패하면 모든 변경 내용이 롤백되고 Databricks가 트랜잭션을 부작용 없이 종료합니다.

트랜잭션에 대한 실습은 자습서: 테이블 간 트랜잭션 조정을 참조하세요.

요구 사항

여러 문 또는 여러 테이블에 걸쳐 있는 트랜잭션을 실행하려면 다음을 수행합니다.

  • 모든 테이블은 반드시 기록되어야 합니다.
  • 지원되는 컴퓨팅 사용:
    • 비대화형 트랜잭션의 경우 Databricks Runtime 18.0 이상을 실행하는 SQL 웨어하우스, 서버리스 컴퓨팅 또는 클러스터를 사용합니다.
    • 대화형 트랜잭션의 경우 SQL 웨어하우스를 사용합니다.
    • Delta Sharing의 공유 자산에서의 트랜잭션의 경우 Databricks Runtime 18.1 이상을 사용합니다.

트랜잭션 모드

Azure Databricks는 두 가지 트랜잭션 모드를 지원합니다.

모드 문법 커밋 롤백 적합한 대상
비상호작용 ATOMIC 복합 문장 성공 시 자동으로 오류 발생 시 자동 수행 고정 시퀀스, 예약된 작업
대화형 BEGIN TRANSACTION; COMMIT; 설명서 설명서 조건부 논리, 유효성 검사 및 디버깅, JDBC, ODBC, PyDBC

두 모드에 대한 자세한 구문, 예제 및 사용 패턴은 트랜잭션 모드를 참조하세요.

지원되는 작업

트랜잭션 내에서 다음 작업을 사용할 수 있습니다.

Operation 설명
SELECT 데이터 쿼리 및 결과 유효성 검사
VALUES 절 테스트 데이터 또는 상수 값 생성
INSERT (모든 변형 포함) 새 행 추가
UPDATE 기존 행 수정
COPY INTO 파일에서 델타 테이블로 데이터 로드
DELETE FROM 행 제거
MERGE INTO 삽입, 업데이트 및 삭제를 결합하는 Upsert 패턴

트랜잭션의 원본 읽기

트랜잭션은 Unity 카탈로그 테이블(델타 및 빙산), 스트리밍 테이블, 뷰 및 구체화된 뷰에서 읽을 수 있습니다. 비거래형 소스에서 읽으려면 allow_nontransactional_reads 힌트를 사용하십시오.

비거래성 원본에서 읽기

JDBC를 사용하여 Parquet 파일, Avro 파일 및 페더레이션 테이블과 같은 비 트랜잭션 원본에서 읽으려면 다음 예제와 같이 힌트를 사용합니다 allow_nontransactional_reads .

BEGIN TRANSACTION;

-- Read from a non-transactional Parquet source
INSERT INTO transactional_table
SELECT col1, col2
FROM parquet.`/path/to/data`
WITH (allow_nontransactional_reads = true);

-- Read from a managed Delta table (no hint needed)
INSERT INTO another_table
SELECT * FROM managed_delta_table;

COMMIT;

경고

트랜잭션이 아닌 읽기는 반복할 수 없습니다. 트랜잭션 중에 원본 데이터를 동시에 변경하면 읽기가 일관되지 않을 수 있습니다.

트랜잭션 격리

트랜잭션은 모든 문에서 반복 가능한 읽기를 제공합니다. 트랜잭션의 테이블에 액세스하면 Azure Databricks는 첫 번째 액세스 시 해당 테이블의 일관된 스냅샷을 캡처합니다. 해당 테이블의 모든 후속 읽기는 이 스냅샷을 사용하므로 다른 사용자가 동일한 테이블을 동시에 수정하더라도 읽기가 일관성을 유지합니다.

Example:

BEGIN TRANSACTION;

-- First access to products table captures snapshot
SELECT * FROM products WHERE product_id = 1001;

-- Another user updates product 1001

-- Still reads the same snapshot (repeatable read)
SELECT * FROM products WHERE product_id = 1001;

COMMIT;

충돌 감지 및 동시성

Azure Databricks는 낙관적 동시성 제어를 사용합니다. 트랜잭션은 잠금 없이 진행되며 커밋 시 충돌이 감지됩니다. 커밋할 때 Azure Databricks는 트랜잭션이 시작된 후 다른 트랜잭션이 동일한 데이터를 수정했는지 여부를 확인합니다. 충돌이 있으면 트랜잭션이 실패합니다. 비대화형 트랜잭션의 경우 롤백도 자동으로 수행됩니다. 대화형 트랜잭션의 경우 새 트랜잭션을 시작하기 전에 명시적으로 실행 ROLLBACK 하여 트랜잭션 상태를 지워야 합니다.

비대화형 트랜잭션은 행 수준 동시성을 지원합니다. 두 트랜잭션은 대상 테이블에서 행 수준 동시성을 사용할 때 충돌하지 않고 동일한 데이터 파일에서 서로 다른 행을 수정할 수 있습니다.

대화형 트랜잭션은 테이블 수준 동시성을 지원합니다.

충돌 시나리오

시나리오 설명
동시 쓰기 충돌 두 트랜잭션이 동일한 행을 업데이트하거나 삭제합니다.
쓰기-읽기 충돌 다른 트랜잭션이 수정한 행을 이 트랜잭션이 읽었습니다. 직렬화 격리에만 적용됩니다.
가상 읽기 충돌 또 다른 트랜잭션은 트랜잭션 읽기 조건자와 일치하는 새 행을 추가했습니다. WriteSerializable 및 Serializable 격리 모두에 적용됩니다.
메타데이터 충돌 다른 트랜잭션이 테이블 스키마 또는 속성을 변경했습니다.

트랜잭션에 대한 격리 수준 및 충돌 해결에 대한 자세한 내용은 트랜잭션 모드를 참조하세요. Azure Databricks의 Delta Lake 테이블에 대한 격리 수준 및 쓰기 충돌 동작에 대한 자세한 내용은 Azure Databricks의 최적화 권장 사항을 참조하세요.

델타 로그에 트랜잭션이 표시되는 방식

성공한 각 트랜잭션은 트랜잭션 내에서 실행된 개별 문의 수에 관계없이 테이블의 델타 로그에 단일 항목으로 표시됩니다. 이렇게 하면 감사 내역이 정리되고 롤백 작업이 간소화됩니다.

트랜잭션 내의 개별 작업은 트랜잭션에 대한 델타 로그 항목에서 JSON 메타데이터로 사용할 수 있습니다.

오류 처리 및 롤백

다음 표에서는 두 트랜잭션 유형에 대해 오류 롤백이 발생하는 방법을 설명합니다.

시나리오 비상호작용 트랜잭션에 대한 작동 대화형 트랜잭션에 대한 동작
구문 실패 오류를 발생시키는 문은 즉시 자동 롤백이 일어납니다. 세션이 여전히 활성 상태인 경우 변경 내용을 취소하려면 ROLLBACK 을 명시적으로 실행해야 합니다.
실패한 유효성 검사 논리 또는 비즈니스 규칙 SIGNAL을(를) 사용하여 예외를 던지고 자동 롤백을 트리거합니다. ROLLBACK을 실행하여 변경 내용을 취소합니다.
세션 연결 끊기 트랜잭션이 자동으로 롤백됩니다. 트랜잭션이 자동으로 롤백됩니다.
일시 중지 총 48시간이 지나면 자동으로 롤백됩니다. 비활성 상태가 10분 지속되거나 총 48시간이 지나면 자동으로 롤백됩니다(제한 사항 참조). 트랜잭션은 부작용 없이 종료되지만 세션이 여전히 활성 상태인 경우 ROLLBACK 을 명시적으로 실행하여 트랜잭션 상태를 지워야 합니다.

대화형 트랜잭션의 경우 ROLLBACK 문을 사용하여 명시적으로 롤백할 수 있습니다. 이는 데이터 검증 논리 또는 비즈니스 규칙에 따라 변경 내용을 취소하거나 세션이 계속 활성 상태로 유지될 때 명령문 실패 후에 유용합니다.

모범 사례

충돌을 줄이고 트랜잭션 성능을 최적화하려면 다음 방법을 따르세요.

충돌 방지

  • 트랜잭션을 짧게 유지: 장기 실행 트랜잭션은 충돌 가능성을 높이고 리소스를 더 오래 보유합니다.
  • 조기 유효성 검사: 트랜잭션 시작 시 사전 조건이 빠르게 실패하도록 확인합니다.
  • Databricks는 대부분의 사용 사례에 비대화형 트랜잭션을 권장합니다. 비대화형 트랜잭션은 행 수준 동시성을 사용합니다. 비대화형 트랜잭션을 참조하세요.
  • 충돌 시 다시 시도: 충돌이 발생하면 새 데이터로 트랜잭션을 다시 시도합니다.

다른 클라이언트의 트랜잭션 사용

트랜잭션은 다양한 클라이언트 인터페이스에서 작동합니다.

제한점

여러 테이블에 걸쳐 있는 트랜잭션에는 다음과 같은 제한 사항이 적용됩니다.

Limitation 설명
대화형 트랜잭션 충돌 대화형 트랜잭션(BEGIN TRANSACTION; ... COMMIT;) 비대화형 트랜잭션보다 더 보수적인 충돌 검색을 사용하고 대상 테이블에서 읽지 않는 작업을 제외하고 INSERT 테이블 수준에서 충돌할 수 있습니다. 행 수준 충돌 검색이 중요한 경우 비대화형 트랜잭션(ATOMIC 복합 문)을 사용합니다. 비대화형 트랜잭션을 참조하세요.
대상 쓰기 Unity 카탈로그에서 관리되는 델타 또는 Iceberg 테이블 중, catalogManaged기능이 활성화된 테이블에만 쓸 수 있습니다. 카탈로그 관리 커밋을 참조하세요.
DML 작업만 트랜잭션은 SELECT, INSERT, UPDATE, DELETE, COPY INTO, 및 MERGE를 지원합니다. 트랜잭션 외부와 같은 CREATE TABLEALTER TABLEDROP TABLEDDL 작업을 실행합니다.
메타데이터 작업이 지원되지 않음 메타데이터 작업은 프로토콜에 관계없이 트랜잭션 내에서 작동하지 않습니다. 여기에는 Thrift RPC 기반 메타데이터 호출(예: JDBC 메서드 및 ODBC DatabaseMetaData 카탈로그 함수), SQL 기반 명령(SHOW TABLES, SHOW DATABASES, DESCRIBE TABLE) 및 SELECT 테이블 또는 시스템 테이블에 대한 information_schema 쿼리가 포함됩니다. 트랜잭션 외부에서 메타데이터 작업을 실행합니다.
COPY INTO 동시성 COPY INTO 명령을 실행 중인 트랜잭션은 다른 COPY INTO 명령이 동일한 테이블에 동시에 쓰고 먼저 커밋하는 경우 실패합니다.
스트리밍 쓰기가 지원되지 않음 스트리밍 테이블에 대한 트랜잭션 쓰기는 지원되지 않습니다.
RLS 및 CLM 테이블이 지원되지 않음 행 필터와 열 마스크가 있는 테이블은 트랜잭션에 참여할 수 없습니다.
테이블 및 뷰 제한 트랜잭션은 최대 100개의 테이블에서 읽거나 쓸 수 있으며 최대 100개의 뷰에서 읽을 수 있습니다. 각 테이블에는 트랜잭션 내에서 최대 100개의 중간 커밋이 있을 수 있습니다.
시간 이동이 지원되지 않음 트랜잭션 내에서는 시간 여행을 사용할 수 없습니다.
유휴 상태 시간 제한 대화형 트랜잭션은 10분 동안 비활성 상태로 롤백됩니다. 트랜잭션은 부작용 없이 종료되지만 세션이 여전히 활성 상태인 경우 ROLLBACK 을 명시적으로 실행하여 트랜잭션 상태를 지워야 합니다.
최대 기간 모든 트랜잭션은 총 기간 48시간 후에 자동으로 롤백됩니다. 대화형 트랜잭션의 경우 트랜잭션이 부작용 없이 종료되지만 세션이 여전히 활성 상태인 경우 ROLLBACK 을 명시적으로 실행하여 트랜잭션 상태를 지워야 합니다.
델타 공유 테이블 공유 요구 사항 델타 공유 공급자는 받는 사람이 트랜잭션을 실행할 수 있도록 테이블을 WITH HISTORY공유해야 합니다. 받는 사람은 모든 유형의 컴퓨팅을 사용하여 트랜잭션을 실행할 수 있습니다.
델타 공유 수신자의 컴퓨팅 제한 Azure Databricks 수신자는 공유 뷰, 구체화된 뷰, 스트리밍 테이블 및 비 Iceberg 외제 테이블에서만 트랜잭션을 실행할 수 있습니다. 공급자와 동일한 Azure Databricks 계정의 받는 사람은 공유 또는 서버리스 컴퓨팅을 사용해야 합니다. 다른 계정의 받는 사람은 서버리스 컴퓨팅을 사용해야 합니다.
델타 공유 원본 테이블 충돌 델타 공유 받는 사람은 단일 트랜잭션 내에서 동일한 원본 테이블을 참조하는 공유 뷰 및 공유 테이블을 참조할 수 없습니다.

다음 단계