ATOMIC-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 Atomblöcke auf der obersten Ebene von systemeigenen 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 nativ kompilierte gespeicherte Prozedur enthält genau einen Block von Transact-SQL-Anweisungen. Dies ist ein ATOMIC-Block.

  • Nicht systemeigene, interpretierte transact-SQL-gespeicherte Prozeduren und Ad-hoc-Batches unterstützen keine Atomblöcke.

ATOMIC-Blöcke werden (unteilbar) innerhalb der Transaktion ausgeführt. Entweder werden alle Anweisungen im Block erfolgreich ausgeführt, oder für den gesamten Block wird ein Rollback zu dem Sicherungspunkt ausgeführt, der beim Starten des Blocks erstellt wurde. Darüber hinaus sind die Sitzungseinstellungen für den ATOMIC-Block fest definiert. Wird derselbe ATOMIC-Block in Sitzungen mit unterschiedlichen Einstellungen ausgeführt, ergibt sich unabhängig von den Einstellungen der aktuellen Sitzung dasselbe 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 beendet wird, wird der erstellte Sicherungspunkt für den Block festgeschrieben. Für die Transaktion wird jedoch erst ein Commit ausgeführt, wenn für die Transaktion auf Sitzungsebene ein Commit erfolgt. Wenn der Block eine Ausnahme auslöst, wird für den ausgeführten Teil des Blocks ein Rollback ausgeführt, die Transaktion auf Sitzungsebene wird jedoch weiterhin ausgeführt, sofern die Ausnahme nicht zum Fehlschlagen der Transaktion führt. Beispielsweise kann ein Schreibkonflikt zum Fehlschlagen einer Transaktion führen, ein Typumwandlungsfehler jedoch nicht.

Wenn eine Sitzung keine aktive Transaktion enthält, wird durch BEGIN ATOMIC eine neue Transaktion gestartet. Wenn außerhalb des Blockbereichs keine Ausnahme ausgelöst wird, wird für die Transaktion am Ende des Blocks ein Commit ausgeführt. Wenn der Block eine Ausnahme auslöst (d. h., die Ausnahme wird nicht innerhalb des Blocks abgefangen und behandelt), wird ein Rollback für die Transaktion ausgeführt. 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 ATOMIC-Blöcken und systemintern 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 im Bereich eines ATOMIC-Blocks auftreten, wird die Transaktion abgebrochen: 10772, 41301, 41302, 41305, 41325, 41332, 41333, und 41839.

Sitzungseinstellungen

Die Sitzungseinstellungen in ATOMIC-Blöcken werden bei der Kompilierung der gespeicherte Prozedur fest definiert. 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 SQL Server-Datumsformate werden unterstützt. Falls angegeben, überschreibt DATEFORMAT das Standarddatumsformat, das LANGUAGEzugeordnet ist.
DATEFIRST Falls angegeben, überschreibt DATEFIRST den Standardwert, der LANGUAGEzugeordnet ist.
DELAYED_DURABILITY Unterstützte Werte sind OFF und ON.

SQL Server-Transaktions-Commits können entweder vollständig dauerhaft, standard oder verzögert dauerhaft sein. Weitere Informationen finden Sie unter Control Transaction Durability.

Die folgenden SET-Optionen verfügen für alle ATOMIC-Blöcke in allen systemintern kompilierten gespeicherten Prozeduren über denselben Systemstandardwert:

SET-Option Systemstandard für ATOMIC-Blöcke
ANSI_NULLS EIN
ANSI_PADDING EIN
ANSI_WARNING EIN
ARITHABORT EIN
ARITHIGNORE OFF
CONCAT_NULL_YIELDS_NULL EIN
IDENTITY_INSERT OFF
NOCOUNT EIN
NUMERIC_ROUNDABORT OFF
QUOTED_IDENTIFIER EIN
ROWCOUNT 0
TEXTSIZE 0
XACT_ABORT OFF

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.

Weitere Informationen

Nativ kompilierte gespeicherte Prozeduren