Freigeben über


Atomblöcke

BEGIN ATOMIC ist Teil des ANSI SQL-Standards. SQL Server unterstützt Atomblöcke nur auf der obersten Ebene der nativ kompilierten gespeicherten Prozeduren.

  • Jede nativ kompilierte gespeicherte Prozedur enthält genau einen Block von Transact-SQL Anweisungen. Dies ist ein ATOM-Block.

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

Atomblöcke werden innerhalb der Transaktion (atomisch) ausgeführt. Entweder werden alle Anweisungen im Block erfolgreich ausgeführt, oder der gesamte Block wird auf den Speicherpunkt zurückgesetzt, der am Anfang des Blocks erstellt wurde. Darüber hinaus sind die Sitzungseinstellungen für den Atomblock festgelegt. Das Ausführen desselben Atomblocks in Sitzungen mit unterschiedlichen Einstellungen führt zu demselben Verhalten, unabhängig von den Einstellungen der aktuellen Sitzung.

Transaktionen und Fehlerbehandlung

Wenn eine Transaktion bereits in einer Sitzung vorhanden ist (da ein Batch eine BEGIN TRANSACTION Anweisung ausgeführt hat und die Transaktion aktiv bleibt), erstellt das Starten eines Atomblocks einen Speicherpunkt in der Transaktion. Wenn der Block ohne Ausnahme endet, committet der Speicherpunkt, der für den Block erstellt wurde, aber die Transaktion wird erst committet, wenn die Transaktion auf Sitzungsebene committet. Wenn der Block eine Ausnahme auslöst, werden die Auswirkungen des Blocks zurückgesetzt. Die Transaktion auf Sitzungsebene wird jedoch fortgesetzt, es sei denn, die Ausnahme gefährdet die Transaktion. Beispielsweise ist ein Schreibkonflikt transaktionsverursachend, aber kein Typumwandlungsfehler.

Wenn in einer Sitzung keine aktive Transaktion vorhanden ist, BEGIN ATOMIC wird eine neue Transaktion gestartet. Wenn keine Ausnahme außerhalb des Bereichs des Blocks ausgelöst wird, wird die Transaktion am Ende des Blocks zugesichert. Wenn der Block eine Ausnahme auslöst (d. h. die Ausnahme wird nicht abgefangen und innerhalb des Blocks behandelt), wird die Transaktion zurückgesetzt. Bei Transaktionen, die einen einzelnen Atomblock (eine einzelne nativ kompilierte gespeicherte Prozedur) umfassen, müssen Sie keine expliziten BEGIN TRANSACTION und COMMIT anweisungen ROLLBACK schreiben.

Nativ kompilierte gespeicherte Prozeduren unterstützen das TRY, CATCHund THROW Konstrukte für die Fehlerbehandlung. RAISERROR wird nicht unterstützt.

Das folgende Beispiel veranschaulicht das Verhalten der Fehlerbehandlung mit Atomblö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  

Die folgenden Fehlermeldungen, die spezifisch für speicheroptimierte Tabellen sind, führen zum Abbruch der Transaktion. Wenn sie im Rahmen eines Atomblocks auftreten, werden sie dazu führen, dass die Transaktion abgebrochen wird: 10772, 41301, 41302, 41305, 41325, 41332 und 41333.

Sitzungseinstellungen

Die Sitzungseinstellungen in Atomblöcken werden festgelegt, wenn die gespeicherte Prozedur kompiliert wird. Einige Einstellungen können mit BEGIN ATOMIC angegeben werden, während andere Einstellungen immer auf denselben Wert festgelegt sind.

Für die folgenden Optionen ist Folgendes erforderlich BEGIN ATOMIC:

Erforderliche Einstellung BESCHREIBUNG
TRANSACTION ISOLATION LEVEL Unterstützte Werte sind SNAPSHOT, REPEATABLEREADund SERIALIZABLE.
LANGUAGE Bestimmt Datums- und Uhrzeitformate und 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. Wenn angegeben, DATEFORMAT überschreibt das Standarddatumsformat, das LANGUAGEzugeordnet ist.
DATEFIRST Wenn angegeben, DATEFIRST überschreibt die Standardeinstellung, die 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 haben denselben Systemstandardwert für alle Atomblöcke in allen nativ kompilierten gespeicherten Prozeduren:

Option festlegen Systemstandardeinstellung für atomare Blöcke
ANSI_NULLS AUF
ANSI_PADDING AUF
ANSI_WARNING AUF
ARITHABORT AUF
ARITHIGNORE AUS
CONCAT_NULL_YIELDS_NULL AUF
IDENTITY_INSERT AUS
NOCOUNT AUF
NUMERIC_ROUNDABORT AUS
QUOTED_IDENTIFIER AUF
Zeilenanzahl 0
Textgröße 0
XACT_ABORT AUS

Nicht abgefangene Ausnahmen führen dazu, dass der atomare Block zurückgesetzt wird, führen jedoch nicht dazu, dass die Transaktion abgebrochen wird, es sei denn, der Fehler gefährdet die Transaktion.

Siehe auch

Nativ kompilierte gespeicherte Prozeduren