기본 프로시저의 Atomic 블록Atomic Blocks in Native Procedures

BEGIN ATOMIC 은 ANSI SQL 표준의 일부입니다.BEGIN ATOMIC is part of the ANSI SQL standard. SQL ServerSQL Server는 고유하게 컴파일된 저장 프로시저와 고유하게 컴파일된 스칼라 사용자 정의 함수에 대해 최상위 수준에서 Atomic 블록을 지원합니다. supports atomic blocks at the top-level of natively compiled stored procedures, as well as for natively compiled, scalar user-defined functions. 이러한 함수에 대한 자세한 내용은 메모리 내 OLTP에 대한 사용자 정의 스칼라 함수를 참조하세요.For more information about these functions, see Scalar User-Defined Functions for In-Memory OLTP.

  • 고유하게 컴파일된 모든 저장 프로시저에는 항상 하나의 Transact-SQLTransact-SQL 문 블록이 포함됩니다.Every natively compiled stored procedure contains exactly one block of Transact-SQLTransact-SQL statements. 이것이 ATOMIC 블록입니다.This is an ATOMIC block.

  • 고유하지 않은 해석된 Transact-SQLTransact-SQL 저장 프로시저 및 임시 일괄 처리는 ATOMIC 블록을 지원하지 않습니다.Non-native, interpreted Transact-SQLTransact-SQL stored procedures and ad hoc batches do not support atomic blocks.

    ATOMIC 블록은 트랜잭션 내에서 하나의 큰 단위로 실행됩니다.Atomic blocks are executed (atomically) within the transaction. 블록의 모든 문이 성공하거나 전체 블록이 블록 시작 시 만들어진 저장점으로 롤백됩니다.Either all statements in the block succeed or the entire block will be rolled back to the savepoint that was created at the start of the block. 또한 세션 설정이 ATOMIC 블록에 대해 고정됩니다.In addition, the session settings are fixed for the atomic block. 세션에서 동일한 ATOMIC 블록을 여러 가지 다른 설정으로 실행하면 현재 세션 설정과 관계없이 같은 동작이 발생합니다.Executing the same atomic block in sessions with different settings will result in the same behavior, independent of the settings of the current session.

트랜잭션 및 오류 처리Transactions and Error Handling

세션에 트랜잭션이 이미 있는 경우( BEGIN TRANSACTION 문과 트랜잭션을 실행한 일괄 처리가 활성 상태로 유지되므로) ATOMIC 블록을 시작하면 트랜잭션에서 저장점을 만듭니다.If a transaction already exists on a session (because a batch executed a BEGIN TRANSACTION statement and the transaction remains active), then starting an atomic block will create a savepoint in the transaction. 예외가 발생하지 않고 블록이 종료되면 블록 커밋에 대한 새 저장점이 만들어지지만 세션 수준에서 트랜잭션이 커밋되어야 트랜잭션이 커밋됩니다.If the block exits without an exception, the savepoint that was created for the block commits, but the transaction will not commit until the transaction at the session level commits. 블록에서 예외가 발생하면 블록의 효과는 롤백되지만 예외로 인해 트랜잭션이 실패하지 않으면 세션 수준의 트랜잭션이 진행됩니다.If the block throws an exception, the effects of the block are rolled back but the transaction at the session level will proceed, unless the exception is transaction-dooming. 예를 들어, 쓰기 충돌로 인해 트랜잭션이 실패하지만 쓰기 충돌이 형식 캐스팅 오류는 아닙니다.For example a write conflict is transaction-dooming, but not a type casting error.

세션에 활성 트랜잭션이 없는 경우 BEGIN ATOMIC 은 새 트랜잭션을 시작합니다.If there is no active transaction on a session, BEGIN ATOMIC will start a new transaction. 블록 범위 밖에서 예외가 발생하지 않는다면 트랜잭션은 블록 끝에서 커밋됩니다.If no exception is thrown outside the scope of the block, the transaction will be committed at the end of the block. 블록에서 예외가 발생하면(예외가 catch되지 않고 블록 내에서 처리됨) 트랜잭션이 롤백됩니다.If the block throws an exception (that is, the exception is not caught and handled within the block), the transaction will be rolled back. 단일 ATOMIC 블록에 걸쳐 있는 트랜잭션(고유하게 컴파일된 단일 저장 프로시저)의 경우 BEGIN TRANSACTIONCOMMIT 또는 ROLLBACK 문을 명시적으로 작성할 필요가 없습니다.For transactions that span a single atomic block (a single natively compiled stored procedure), you do not need to write explicit BEGIN TRANSACTION and COMMIT or ROLLBACK statements.

고유하게 컴파일된 저장 프로시저는 오류 처리를 위해 TRY, CATCHTHROW 구문을 지원합니다.Natively compiled stored procedures support the TRY, CATCH, and THROW constructs for error handling. RAISERROR 은 지원되지 않습니다.RAISERROR is not supported.

다음 예에서는 ATOMIC 블록 및 고유하게 컴파일된 저장 프로시저에 대한 오류 처리 동작을 설명합니다.The following example illustrates the error handling behavior with atomic blocks and natively compiled stored procedures:

-- 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  

메모리 액세스에 최적화된 테이블에 대한 다음 오류 메시지가 발생하면 트랜잭션이 실패합니다.The following error messages specific to memory-optimized tables are transaction dooming. Atomic 블록 범위 내에서 10772, 41301, 41302, 41305, 41325, 41332 및 41333 오류가 발생하면 트랜잭션을 중단시킵니다.If they occur in the scope of an atomic block, they will cause the transaction to abort: 10772, 41301, 41302, 41305, 41325, 41332, and 41333.

세션 설정Session Settings

저장 프로시저가 컴파일되면 ATOMIC 블록의 세션 설정은 고정됩니다.The session settings in atomic blocks are fixed when the stored procedure is compiled. 설정은 BEGIN ATOMIC 으로 지정할 수도 있고 같은 값으로 항상 고정할 수도 있습니다.Some settings can be specified with BEGIN ATOMIC while other settings are always fixed to the same value.

BEGIN ATOMIC에는 다음 옵션이 필요합니다.The following options are required with BEGIN ATOMIC:

필요한 설정Required Setting DescriptionDescription
TRANSACTION ISOLATION LEVELTRANSACTION ISOLATION LEVEL 지원되는 값은 SNAPSHOT, REPEATABLEREADSERIALIZABLE입니다.Supported values are SNAPSHOT, REPEATABLEREAD, and SERIALIZABLE.
LANGUAGELANGUAGE 날짜 및 시간 형식과 시스템 메시지를 결정합니다.Determines date and time formats and system messages. sys.syslanguages(Transact-SQL)의 모든 언어와 별칭이 지원됩니다.All languages and aliases in sys.syslanguages (Transact-SQL) are supported.

다음 설정은 선택 사항입니다.The following settings are optional:

선택적 설정Optional Setting DescriptionDescription
DATEFORMATDATEFORMAT 모든 SQL ServerSQL Server 날짜 형식이 지원됩니다.All SQL ServerSQL Server date formats are supported. 지정되면 DATEFORMAT 에서 LANGUAGE와 관련된 기본 날짜 형식을 재정의합니다.When specified, DATEFORMAT overrides the default date format associated with LANGUAGE.
DATEFIRSTDATEFIRST 지정되면 DATEFIRST 에서 LANGUAGE와 관련된 기본값을 재정의합니다.When specified, DATEFIRST overrides the default associated with LANGUAGE.
DELAYED_DURABILITYDELAYED_DURABILITY 지원되는 값은 OFFON입니다.Supported values are OFF and ON.

SQL ServerSQL Server 트랜잭션은 완전 내구성이 있는(기본값) 커밋 또는 지연된 내구성이 있는 커밋을 수행할 수 있습니다. 자세한 내용은 트랜잭션 내구성 제어를 참조하세요. transaction commits can be either fully durable, the default, or delayed durable.For more information, see Control Transaction Durability.

다음 SET 옵션은 고유하게 컴파일된 모든 저장 프로시저의 모든 ATOMIC 블록에 대해 동일한 시스템 기본값을 가집니다.The following SET options have the same system default value for all atomic blocks in all natively compiled stored procedures:

SET 옵션Set Option ATOMIC 블록의 시스템 기본값System Default for Atomic Blocks
ANSI_NULLSANSI_NULLS ONON
ANSI_PADDINGANSI_PADDING ONON
ANSI_WARNINGANSI_WARNING ONON
ARITHABORTARITHABORT ONON
ARITHIGNOREARITHIGNORE OFFOFF
CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL ONON
IDENTITY_INSERTIDENTITY_INSERT OFFOFF
NOCOUNTNOCOUNT ONON
NUMERIC_ROUNDABORTNUMERIC_ROUNDABORT OFFOFF
QUOTED_IDENTIFIERQUOTED_IDENTIFIER ONON
ROWCOUNTROWCOUNT 00
TEXTSIZETEXTSIZE 00
XACT_ABORTXACT_ABORT OFFOFF

catch되지 않는 예외는 ATOMIC 블록을 롤백시키지만 오류로 인해 트랜잭션이 실패하지 않는다면 트랜잭션이 중단되지 않습니다.Uncaught exceptions cause the atomic block to roll back, but not cause the transaction to abort unless the error is transaction dooming.

관련 항목:See Also

고유하게 컴파일된 저장 프로시저Natively Compiled Stored Procedures