다음을 통해 공유


원자 블록

BEGIN ATOMIC 는 ANSI SQL 표준의 일부입니다. SQL Server는 고유하게 컴파일된 저장 프로시저의 최상위 수준에서만 원자성 블록을 지원합니다.

  • 고유하게 컴파일된 모든 저장 프로시저에는 정확히 한 블록의 Transact-SQL 문이 포함되어 있습니다. ATOMIC 블록입니다.

  • 기본이 아닌 해석된 Transact-SQL 저장 프로시저 및 임시 일괄 처리는 원자성 블록을 지원하지 않습니다.

원자적 블록은 트랜잭션 내에서 원자적으로 실행됩니다. 블록의 모든 문이 성공하거나 전체 블록이 블록의 시작 부분에 생성된 저장점으로 롤백됩니다. 또한 세션 설정은 원자성 블록에 대해 고정됩니다. 다른 설정으로 세션에서 동일한 원자성 블록을 실행하면 현재 세션의 설정과 관계없이 동일한 동작이 발생합니다.

트랜잭션 및 오류 처리

일괄 처리가 BEGIN TRANSACTION문을 실행하여 트랜잭션이 세션에서 이미 존재하고 활성 상태로 남아 있는 경우, 원자성 블록을 시작하면 트랜잭션에 저장점이 생성됩니다. 예외 없이 블록이 종료되면 블록에 대해 만들어진 저장점이 커밋되지만 세션 수준의 트랜잭션이 커밋될 때까지 트랜잭션이 커밋되지 않습니다. 블록에서 예외가 발생하면 블록의 효과는 롤백되지만, 예외가 트랜잭션을 종료시키는 경우가 아니라면 세션 수준의 트랜잭션은 계속 진행됩니다. 예를 들어 쓰기 충돌은 트랜잭션을 실패하게 하지만, 형식 캐스팅 오류는 트랜잭션에 영향을 주지 않습니다.

세션 BEGIN ATOMIC 에 활성 트랜잭션이 없으면 새 트랜잭션이 시작됩니다. 블록의 영역을 벗어나는 예외가 throw되지 않으면 블록이 종료될 때 트랜잭션이 커밋됩니다. 블록에서 예외가 발생하여(즉, 블록 내에서 예외가 포착되어 처리되지 않는 경우) 트랜잭션이 롤백됩니다. 단일 원자성 블록(고유하게 컴파일된 단일 저장 프로시저)에 걸쳐 있는 트랜잭션의 경우 명시적 BEGIN TRANSACTIONCOMMIT 또는 ROLLBACK 문을 작성할 필요가 없습니다.

고유하게 컴파일된 저장 프로시저는 오류 처리를 위해 TRY, CATCH, 및 THROW 구문을 지원합니다. RAISERROR 지원되지 않습니다.

다음 예제에서는 원자성 블록 및 고유하게 컴파일된 저장 프로시저를 사용하여 오류 처리 동작을 보여 줍니다.

-- sample table  
CREATE TABLE dbo.t1 (  
  c1 int not null primary key nonclustered  
)  
WITH (MEMORY_OPTIMIZED=ON)  
GO  
  
-- sample proc that inserts 2 rows  
CREATE PROCEDURE dbo.usp_t1 @v1 bigint not null, @v2 bigint not null  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS  
BEGIN ATOMIC  
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english', DELAYED_DURABILITY = ON)  
  
  INSERT dbo.t1 VALUES (@v1)  
  INSERT dbo.t1 VALUES (@v2)  
  
END  
GO  
  
-- insert two rows  
EXEC dbo.usp_t1 1, 2  
GO  
  
-- verify we have no active transaction  
SELECT @@TRANCOUNT  
GO  
  
-- verify the rows 1 and 2 were committed  
SELECT c1 FROM dbo.t1  
GO  
  
-- execute proc with arithmetic overflow  
EXEC dbo.usp_t1 3, 4444444444444  
GO  
-- expected error message:  
-- Msg 8115, Level 16, State 0, Procedure usp_t1  
-- Arithmetic overflow error converting bigint to data type int.  
  
-- verify we have no active transaction  
SELECT @@TRANCOUNT  
GO  
  
-- verify rows 3 was not committed; usp_t1 has been rolled back  
SELECT c1 FROM dbo.t1  
GO  
  
-- start a new transaction  
BEGIN TRANSACTION  
  -- insert rows 3 and 4  
  EXEC dbo.usp_t1 3, 4  
  
  -- verify there is still an active transaction  
  SELECT @@TRANCOUNT  
  
  -- verify the rows 3 and 4 were inserted  
  SELECT c1 FROM dbo.t1 WITH (SNAPSHOT)   
  ORDER BY c1  
  
  -- catch the arithmetic overflow error  
  BEGIN TRY  
    EXEC dbo.usp_t1 5, 4444444444444  
  END TRY  
  BEGIN CATCH  
    PRINT N'Error occurred: ' + error_message()  
  END CATCH  
  
  -- verify there is still an active transaction  
  SELECT @@TRANCOUNT  
  
  -- verify rows 3 and 4 are still in the table, and row 5 has not been inserted  
  SELECT c1 FROM dbo.t1 WITH (SNAPSHOT)   
  ORDER BY c1  
  
COMMIT  
GO  
  
-- verify we have no active transaction  
SELECT @@TRANCOUNT  
GO  
  
-- verify rows 3 and 4 has been committed  
SELECT c1 FROM dbo.t1  
ORDER BY c1  
GO  

메모리 최적화 테이블과 관련된 다음 오류 메시지는 트랜잭션 종료입니다. 원자성 블록의 범위에서 발생하는 경우 트랜잭션이 중단됩니다. 10772, 41301, 41302, 41305, 41325, 41332 및 41333.

세션 설정

원자성 블록의 세션 설정은 저장 프로시저가 컴파일될 때 수정됩니다. 일부 설정은 BEGIN ATOMIC 지정할 수 있지만 다른 설정은 항상 동일한 값으로 고정됩니다.

다음과 같은 옵션이 필요합니다.BEGIN ATOMIC

필수 설정 설명
TRANSACTION ISOLATION LEVEL 지원되는 값은 SNAPSHOT, REPEATABLEREADSERIALIZABLE입니다.
LANGUAGE 날짜 및 시간 형식 및 시스템 메시지를 결정합니다. sys.syslanguages(Transact-SQL)의 모든 언어 및 별칭이 지원됩니다.

다음 설정은 선택 사항입니다.

선택적 설정 설명
DATEFORMAT 모든 SQL Server 날짜 형식이 지원됩니다. 지정 시 DATEFORMATLANGUAGE에 연결된 기본 날짜 형식을 덮어씁니다.
DATEFIRST 지정하면 DATEFIRSTLANGUAGE에 연결된 기본값을 재정의합니다.
DELAYED_DURABILITY 지원되는 값은 OFFON.

SQL Server 트랜잭션 커밋은 완전 내구성, 기본값 또는 지연된 지속성 중 하나일 수 있습니다. 자세한 내용은 제어 트랜잭션 내구성을 참조하세요.

다음 SET 옵션은 고유하게 컴파일된 모든 저장 프로시저의 모든 원자성 블록에 대해 동일한 시스템 기본값을 갖습니다.

옵션 설정 Atomic 블록에 대한 시스템 기본값
ANSI_NULLS (NULL 처리를 ANSI 표준으로 설정하는 옵션) 켜짐
ANSI_PADDING (ANSI 표준 여백) 켜짐
ANSI_WARNING 켜짐
ARITHABORT (아리드어보트) 켜짐
ARITHIGNORE OFF
CONCAT_NULL_YIELDS_NULL (NULL 병합 중 null 반환) 켜짐
IDENTITY_INSERT (IDENTITY 열 삽입) OFF
행 수 표시 안함 켜짐
NUMERIC_ROUNDABORT (숫자 반올림 중단) OFF
따옴표로 묶인 식별자 켜짐
행 수 (ROWCOUNT) 0
텍스트 크기 0
XACT_ABORT (SQL Server 환경에서 트랜잭션 오류 발생 시 모든 변경 사항을 자동으로 롤백하는 설정) OFF

잡히지 않은 예외로 인해 원자성 블록이 롤백되지만, 트랜잭션 종료 오류가 아닌 경우 트랜잭션이 중단되지 않습니다.

또한 참조하십시오

고유하게 컴파일된 저장 프로시저