Blocchi atomici nelle procedure nativeAtomic Blocks in Native Procedures

BEGIN ATOMIC fa parte dello standard SQL ANSI.BEGIN ATOMIC is part of the ANSI SQL standard. SQL ServerSQL Server supporta i blocchi atomici al livello superiore di stored procedure compilate in modo nativo, nonché per le funzioni compilate in modo nativo e scalari definite dall'utente. supports atomic blocks at the top-level of natively compiled stored procedures, as well as for natively compiled, scalar user-defined functions. Per altre informazioni su queste funzioni, vedere Funzioni scalari definite dall'utente per OLTP in memoria.For more information about these functions, see Scalar User-Defined Functions for In-Memory OLTP.

  • Ogni stored procedure compilata in modo nativo contiene un blocco di istruzioni Transact-SQLTransact-SQL .Every natively compiled stored procedure contains exactly one block of Transact-SQLTransact-SQL statements. Si tratta di un blocco ATOMIC.This is an ATOMIC block.

  • Le stored procedure Transact-SQLTransact-SQL interpretate e non native e i batch ad hoc non supportano i blocchi atomici.Non-native, interpreted Transact-SQLTransact-SQL stored procedures and ad hoc batches do not support atomic blocks.

    I blocchi atomici vengono eseguiti (in modo atomico) nella transazione.Atomic blocks are executed (atomically) within the transaction. Tutte le istruzioni nel blocco devono avere esito positivo, altrimenti verrà eseguito il rollback dell'intero blocco al punto di salvataggio creato all'inizio del blocco.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. Inoltre, per il blocco atomico tutte le impostazioni di sessione sono fisse.In addition, the session settings are fixed for the atomic block. L'esecuzione dello stesso blocco atomico in sessioni con impostazioni diverse genera lo stesso comportamento, indipendentemente dalle impostazioni della sessione corrente.Executing the same atomic block in sessions with different settings will result in the same behavior, independent of the settings of the current session.

Transazioni e gestione degli erroriTransactions and Error Handling

Se in una sessione esiste già una transazione (perché un batch ha eseguito un'istruzione BEGIN TRANSACTION e la transazione rimane attiva), l'avvio di un blocco atomico creerà un punto di salvataggio nella transazione.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. Se il blocco viene chiuso senza un'eccezione, viene eseguito il commit del punto di salvataggio creato per il blocco, ma non verrà eseguito il commit della transazione finché non viene eseguito il commit a livello di sessione.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. Se il blocco genera un'eccezione, viene eseguito il rollback degli effetti del blocco, ma la transazione procede a livello di sessione, a meno che l'eccezione non la termini.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. Ad esempio, un conflitto di scrittura comporta la fine della transazione, ma non un errore di cast del tipo.For example a write conflict is transaction-dooming, but not a type casting error.

Se non è presente alcuna transazione attiva in una sessione, BEGIN ATOMIC avvia una nuova transazione.If there is no active transaction on a session, BEGIN ATOMIC will start a new transaction. Se non viene generata alcuna eccezione all'esterno dell'ambito del blocco, verrà eseguito il commit della transazione alla fine del blocco.If no exception is thrown outside the scope of the block, the transaction will be committed at the end of the block. Se il blocco genera un'eccezione (l'eccezione non viene rilevata e gestita nel blocco), verrà eseguito il rollback della transazione.If the block throws an exception (that is, the exception is not caught and handled within the block), the transaction will be rolled back. Per le transazioni che interessano un singolo blocco atomico (una singola stored procedure compilata in modo nativo), non è necessario scrivere istruzioni BEGIN TRANSACTION e COMMIT o ROLLBACK esplicite.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.

Le stored procedure compilate in modo nativo supportano i costrutti TRY, CATCHe THROW per la gestione degli errori.Natively compiled stored procedures support the TRY, CATCH, and THROW constructs for error handling. RAISERROR non è supportato.RAISERROR is not supported.

Nell'esempio seguente viene illustrato il comportamento della gestione degli errori con blocchi atomici e stored procedure compilate in modo nativo: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  

I messaggi di errore seguenti specifici delle tabelle con ottimizzazione per la memoria comportano la fine della transazione.The following error messages specific to memory-optimized tables are transaction dooming. Se si verificano nell'ambito di un blocco atomico, causano l'interruzione della transazione: 10772, 41301, 41302, 41305, 41325, 41332 e 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.

Impostazioni sessioneSession Settings

Le impostazioni di sessione nei blocchi atomici sono fisse quando la stored procedure è compilata.The session settings in atomic blocks are fixed when the stored procedure is compiled. Alcune impostazioni possono essere specificate con BEGIN ATOMIC , mentre altre sono sempre fisse sullo stesso valore.Some settings can be specified with BEGIN ATOMIC while other settings are always fixed to the same value.

Le opzioni seguenti sono necessarie con BEGIN ATOMIC:The following options are required with BEGIN ATOMIC:

Impostazione necessariaRequired Setting DescriptionDescription
TRANSACTION ISOLATION LEVELTRANSACTION ISOLATION LEVEL I valori supportati sono SNAPSHOT, REPEATABLEREADe SERIALIZABLE.Supported values are SNAPSHOT, REPEATABLEREAD, and SERIALIZABLE.
LANGUAGELANGUAGE Determina i formati data e ora e i messaggi di sistema.Determines date and time formats and system messages. Tutti i linguaggi e gli alias in sys.syslanguages (Transact-SQL) sono supportati.All languages and aliases in sys.syslanguages (Transact-SQL) are supported.

Le impostazioni seguenti sono facoltative:The following settings are optional:

Impostazione facoltativaOptional Setting DescriptionDescription
DATEFORMATDATEFORMAT Tutti i formati data di SQL ServerSQL Server sono supportati.All SQL ServerSQL Server date formats are supported. Quando viene specificata, DATEFORMAT esegue l'override del formato data predefinito associato a LANGUAGE.When specified, DATEFORMAT overrides the default date format associated with LANGUAGE.
DATEFIRSTDATEFIRST Quando viene specificata, DATEFIRST esegue l'override del valore predefinito associato a LANGUAGE.When specified, DATEFIRST overrides the default associated with LANGUAGE.
DELAYED_DURABILITYDELAYED_DURABILITY I valori supportati sono OFF e ON.Supported values are OFF and ON.

Il commit delle transazioni SQL ServerSQL Server può essere completamente durevole, che è l'impostazione predefinita, oppure con durabilità ritardata. Per altre informazioni, vedere Controllo della durabilità delle transazioni. SQL ServerSQL Server transaction commits can be either fully durable, the default, or delayed durable.For more information, see Control Transaction Durability.

Le opzioni SET seguenti presentano lo stesso valore predefinito di sistema per tutti i blocchi atomici in tutte le stored procedure compilate in modo nativo:The following SET options have the same system default value for all atomic blocks in all natively compiled stored procedures:

Opzione SETSet Option Impostazione predefinita di sistema per i blocchi atomiciSystem 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

Le eccezioni non rilevate causano il rollback dei blocchi atomici, ma non l'interruzione della transazione, a meno che l'errore non comporti la fine della transazione.Uncaught exceptions cause the atomic block to roll back, but not cause the transaction to abort unless the error is transaction dooming.

Vedere ancheSee Also

Stored procedure compilate in modo nativoNatively Compiled Stored Procedures