Atomare Blöcke in nativen Prozeduren

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

BEGIN ATOMIC ist Teil des ANSI SQL-Standards. SQL Server unterstützt ATOMIC-Blöcke auf der obersten Ebene der nativ kompilierten gespeicherten Prozeduren sowie für nativ kompilierte, skalare benutzerdefinierte Funktionen. Weitere Informationen zu diesen Funktionen finden Sie unter Benutzerdefinierte Skalarfunktionen für In-Memory-OLTP.

  • Jede systemintern kompilierte gespeicherte Prozedur enthält genau einen Block mit Transact-SQL-Anweisungen. Dies ist ein ATOMIC-Block.

  • Nicht systemeigene interpretierte gespeicherte Transact-SQL-Prozeduren und Ad-hoc-Batches unterstützen keine ATOMIC-Blöcke.

Atomare Blöcke werden (atomar) innerhalb der Transaktion ausgeführt. Entweder werden alle Anweisungen im Block erfolgreich ausgeführt, oder der gesamte Block wird auf den zu Beginn des Blocks erstellten Speicherpunkt zurückgesetzt. Darüber hinaus sind die Sitzungseinstellungen für den atomic block festgelegt. Wird derselbe ATOMIC-Block in Sessions mit unterschiedlichen Einstellungen ausgeführt, führt dies unabhängig von den Einstellungen der aktuellen Session zum selben Verhalten.

Transaktionen und Fehlerbehandlung

Wenn in einer Sitzung bereits eine Transaktion vorhanden ist (da von einem Batch eine BEGIN TRANSACTION -Anweisung ausgeführt wurde und die Transaktion aktiv bleibt), wird durch das Starten eines ATOMIC-Blocks in der Transaktion ein Sicherungspunkt erstellt. Wenn der Block ohne Ausnahme verlassen wird, wird der für den Block erstellte Speicherpunkt festgeschrieben, die Transaktion selbst wird jedoch erst dann festgeschrieben, wenn die Transaktion auf Sitzungsebene committet wird. Wenn der Block eine Ausnahme auslöst, werden die Auswirkungen des Blocks zurückgesetzt, die Transaktion auf Sitzungsebene wird jedoch fortgesetzt, sofern die Ausnahme nicht die Transaktion zum Scheitern verurteilt. Beispielsweise führt ein Schreibkonflikt zum Fehlschlagen der Transaktion, ein Typumwandlungsfehler jedoch nicht.

Wenn eine Sitzung keine aktive Transaktion enthält, wird durch BEGIN ATOMIC eine neue Transaktion gestartet. Wenn außerhalb des Blocks keine Ausnahme ausgelöst wird, wird die Transaktion am Ende des Blocks festgeschrieben. Wenn der Block eine Ausnahme auslöst (d. h. wenn die Ausnahme nicht innerhalb des Blocks abgefangen und behandelt wird), wird die Transaktion zurückgesetzt. Bei Transaktionen, die einen einzelnen ATOMIC-Block (eine einzelne nativ kompilierte gespeicherte Prozedur) umfassen, ist es nicht notwendig, explizite BEGIN TRANSACTION und COMMIT oder ROLLBACK -Anweisungen zu schreiben.

Systemintern kompilierte gespeicherte Prozeduren unterstützen TRY-, CATCH- und THROW -Konstrukte zur Fehlerbehandlung. RAISERROR wird nicht unterstützt.

Das folgende Beispiel veranschaulicht das Fehlerbehandlungsverhalten bei atomaren Blöcken und nativ kompilierten gespeicherten Prozeduren:

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

Bei folgenden, für speicheroptimierte Tabellen spezifischen Fehlern schlägt eine Transaktion fehl. Wenn sie innerhalb eines atomaren Blocks auftreten, führen sie zum Abbruch der Transaktion: 10772, 41301, 41302, 41305, 41325, 41332, 41333 und 41839.

Sitzungseinstellungen

Die Sitzungseinstellungen in atomaren Blöcken werden bei der Kompilierung der gespeicherten Prozedur festgelegt. Einige Einstellungen können mit BEGIN ATOMIC angegeben werden, während andere immer denselben festen Wert aufweisen.

Die folgenden Optionen sind für BEGIN ATOMICerforderlich:

Erforderliche Einstellung Beschreibung
TRANSACTION ISOLATION LEVEL Unterstützte Werte sind SNAPSHOT, REPEATABLEREADund SERIALIZABLE.
LANGUAGE Bestimmt Datums- und Uhrzeitformate sowie Systemmeldungen. Alle Sprachen und Aliase in sys.syslanguages (Transact-SQL) werden unterstützt.

Die folgenden Einstellungen sind optional:

Optionale Einstellung Beschreibung
DATEFORMAT Alle Datumsformate von SQL Server werden unterstützt. Wenn angegeben, überschreibt DATEFORMAT das mit LANGUAGE verknüpfte Standard-Datumsformat.
DATEFIRST Wenn angegeben, DATEFIRST überschreibt die Standardeinstellung, die LANGUAGEzugeordnet ist.
DELAYED_DURABILITY Unterstützte Werte sind OFF und ON.

SQL Server Transaktionscommits können entweder vollständig dauerhaft (Standardeinstellung) oder verzögert dauerhaft sein. Weitere Informationen finden Sie unter Steuern der Transaktionsdauerhaftigkeit.

Die folgenden SET Optionen weisen denselben Systemstandardwert für alle Atomblöcke in allen systemeigenen gespeicherten Prozeduren auf:

Option festlegen Systemvorgabe für Atomic Blocks
ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNING ON
ARITHABORT ON
ARITHIGNORE AUS
CONCAT_NULL_YIELDS_NULL ON
IDENTITY_INSERT AUS
NOCOUNT ON
NUMERIC_ROUNDABORT AUS
QUOTED_IDENTIFIER ON
ROWCOUNT 0
TEXTSIZE 0
XACT_ABORT AUS

Nicht abgefangene Ausnahmen bewirken ein Rollback für den ATOMIC-Block, führen jedoch nicht zu einem Abbruch der Transaktion, solange die Transaktion durch den Fehler nicht fehlschlägt.

Siehe auch

Nativ kompilierte gespeicherte Prozeduren