Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Azure 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. |