Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
, Database SQL di Azure
e Istanza gestita di SQL di Azure
BEGIN ATOMIC fa parte dello standard SQL ANSI. SQL Server supporta i blocchi atomici a livello superiore delle stored procedure compilate in modo nativo, nonché nelle funzioni scalari definite dall'utente compilate in modo nativo. Per altre informazioni su queste funzioni, vedere Funzioni scalari definite dall'utente per OLTP in memoria.
Ogni stored procedure compilata nativamente contiene esattamente un blocco di istruzioni Transact-SQL. Si tratta di un blocco ATOMIC.
Le stored procedure Transact-SQL non native e interpretate e i batch ad hoc non supportano i blocchi atomici.
I blocchi atomici vengono eseguiti (in modo atomico) all'interno della transazione. O tutte le istruzioni nel blocco hanno esito positivo, oppure l'intero blocco verrà riportato al punto di salvataggio creato all'inizio del blocco. Inoltre, per il blocco atomico tutte le impostazioni di sessione sono fisse. L'esecuzione dello stesso blocco atomico in sessioni con impostazioni diverse genera lo stesso comportamento, indipendentemente dalle impostazioni della sessione corrente.
Transazioni e gestione degli errori
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. Se il blocco termina senza generare alcuna eccezione, il punto di salvataggio creato per il blocco viene confermato, ma la transazione non verrà confermata finché non verrà confermata la transazione a livello di sessione. Se il blocco genera un'eccezione, viene eseguito il rollback degli effetti del blocco, ma la transazione proseguirà a livello di sessione, a meno che l'eccezione non sia fatale per la transazione. Ad esempio, un conflitto di scrittura provoca l’interruzione della transazione, ma non un errore di conversione di tipo.
Se non è presente alcuna transazione attiva in una sessione, BEGIN ATOMIC avvia una nuova transazione. Se non viene generata alcuna eccezione al di fuori del blocco, verrà effettuato il commit della transazione alla fine del blocco. Se il blocco genera un'eccezione (l'eccezione non viene rilevata e gestita nel blocco), verrà eseguito il rollback della transazione. 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.
Le stored procedure compilate in modo nativo supportano i costrutti TRY, CATCHe THROW per la gestione degli errori. RAISERROR non è supportato.
L'esempio seguente illustra il comportamento in caso di errore con blocchi atomici e stored procedure compilate in modo nativo:
-- 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 ottimizzate per la memoria comportano la fine della transazione. Se si verificano nell'ambito di un blocco atomico, causano l'interruzione della transazione: 10772, 41301, 41302, 41305, 41325, 41332, 41333 e 41839.
Impostazioni sessione
Le impostazioni di sessione nei blocchi atomici sono fisse quando la stored procedure è compilata. Alcune impostazioni possono essere specificate con BEGIN ATOMIC , mentre altre sono sempre fisse sullo stesso valore.
Le opzioni seguenti sono necessarie con BEGIN ATOMIC:
| Impostazione necessaria | Descrizione |
|---|---|
| TRANSACTION ISOLATION LEVEL | I valori supportati sono SNAPSHOT, REPEATABLEREADe SERIALIZABLE. |
| LANGUAGE | Determina i formati data e ora e i messaggi di sistema. Tutti i linguaggi e gli alias in sys.syslanguages (Transact-SQL) sono supportati. |
Le impostazioni seguenti sono facoltative:
| Impostazione facoltativa | Descrizione |
|---|---|
| DATEFORMAT | Tutti i formati data di SQL Server sono supportati. Se specificato, DATEFORMAT esegue l'override del formato di data predefinito associato a LANGUAGE. |
| DATEFIRST | Se specificato, DATEFIRST esegue l'override del valore predefinito associato a LANGUAGE. |
| DELAYED_DURABILITY | I valori supportati sono OFF e ON. Il commit delle transazioni SQL Server può essere completamente durevole, che è l'impostazione predefinita, oppure con durabilità ritardata. Per altre informazioni, vedi Controllo della durabilità delle transazioni. |
Le opzioni seguenti SET hanno lo stesso valore predefinito di sistema per tutti i blocchi atomici in tutte le stored procedure compilate in modo nativo:
| Imposta opzione | Impostazione predefinita di sistema per i blocchi atomici |
|---|---|
| ANSI_NULLS | Attivo |
| ANSI_PADDING | Attivo |
| ANSI_WARNING | Attivo |
| ARITHABORT | Attivo |
| ARITHIGNORE | OFF |
| CONCAT_NULL_YIELDS_NULL | Attivato |
| IDENTITY_INSERT | OFF |
| NOCOUNT | Attivato |
| NUMERIC_ROUNDABORT | OFF |
| QUOTED_IDENTIFIER | Attivato |
| ROWCOUNT | 0 |
| TEXTSIZE | 0 |
| XACT_ABORT | OFF 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. |