Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
BEGIN ATOMIC maakt deel uit van de ANSI SQL-standaard. SQL Server ondersteunt zowel atomische blokken op het hoogste niveau van systeemeigen gecompileerde opgeslagen procedures, als ook voor systeemeigen gecompileerde, scalaire door de gebruiker gedefinieerde functies. Zie Scalar User-Defined Functions voor In-Memory OLTP voor meer informatie over deze functies.
Elke systeemeigen gecompileerde opgeslagen procedure bevat precies één blok Transact-SQL instructies. Dit is een ATOMIC-blok.
Niet-systeemeigen, geïnterpreteerde Transact-SQL opgeslagen procedures en ad-hocbatches bieden geen ondersteuning voor atomische blokken.
Atomische blokken worden uitgevoerd (atomisch) binnen de transactie. Alle instructies in het blok slagen of het hele blok wordt teruggedraaid naar het opslagpunt dat aan het begin van het blok is gemaakt. Daarnaast worden de sessie-instellingen vastgezet voor het atomische blok. Het uitvoeren van hetzelfde atomische blok in sessies met verschillende instellingen leidt tot hetzelfde gedrag, onafhankelijk van de instellingen van de huidige sessie.
Transacties en foutafhandeling
Als er al een transactie bestaat op een sessie (omdat een batch een BEGIN TRANSACTION-instructie heeft uitgevoerd en de transactie actief blijft), maakt het starten van een atomisch blok een savepoint in de transactie. Als het blok wordt afgesloten zonder uitzondering te genereren, wordt het opslagpunt dat voor het blok is gemaakt doorgevoerd, maar de transactie wordt pas doorgevoerd als de transactie op sessieniveau wordt doorgevoerd. Wanneer het blok een uitzondering genereert, worden de effecten van het blok teruggedraaid, maar de transactie op sessieniveau wordt voortgezet, tenzij de uitzondering fataal is voor de transactie. Een schrijfconflict maakt bijvoorbeeld een transactie onsuccesvol, maar een type-castingfout doet dat niet.
Als er geen actieve transactie op een sessie is, start BEGIN ATOMIC een nieuwe transactie. Als er geen uitzondering wordt gegenereerd buiten het bereik van het blok, wordt de transactie aan het einde van het blok doorgevoerd. Als het blok een uitzondering genereert (dat wil zeggen, als de uitzondering niet wordt gevangen en verwerkt binnen het blok), wordt de transactie teruggedraaid. Voor transacties die één atomisch blok omvatten (één systeemeigen gecompileerde opgeslagen procedure), hoeft u geen expliciete BEGIN TRANSACTION - en COMMIT - of ROLLBACK-instructies te schrijven.
Systeemeigen gecompileerde opgeslagen procedures ondersteunen de TRY-, CATCH- en THROW-constructies voor foutafhandeling. RAISERROR wordt niet ondersteund.
In het volgende voorbeeld ziet u het gedrag van foutafhandeling met atomische blokken en systeemeigen gecompileerde opgeslagen procedures:
-- 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
De volgende foutberichten die specifiek voor geheugen-geoptimaliseerde tabellen gelden, leiden tot het mislukken van de transactie. Als ze voorkomen in het bereik van een atomisch blok, zullen ze ervoor zorgen dat de transactie wordt afgebroken: 10772, 41301, 41302, 41305, 41325, 41332, 41333 en 41839.
Sessie-instellingen
De sessie-instellingen in atomische blokken worden vastgesteld wanneer de opgeslagen procedure wordt gecompileerd. Sommige instellingen kunnen worden opgegeven met BEGIN ATOMIC , terwijl andere instellingen altijd worden vastgezet op dezelfde waarde.
De volgende opties zijn vereist met BEGIN ATOMIC:
| Vereiste instelling | Description |
|---|---|
| NIVEAU TRANSACTIEISOLATIE | Ondersteunde waarden zijn SNAPSHOT, REPEATABLEREAD en SERIALIZABLE. |
| TAAL | Bepaalt datum- en tijdnotaties en systeemberichten. Alle talen en aliassen in sys.syslanguages (Transact-SQL) worden ondersteund. |
De volgende instellingen zijn optioneel:
| Optionele instelling | Description |
|---|---|
| DATUMNOTATIE | Alle datumnotaties van SQL Server worden ondersteund. Wanneer dit is opgegeven, overschrijft DATEFORMAT de standaarddatumnotatie die is gekoppeld aan LANGUAGE. |
| DATEFIRST | Wanneer dit is opgegeven, overschrijft DATEFIRST de standaardwaarde die is gekoppeld aan LANGUAGE. |
| DELAYED_DURABILITY | Ondersteunde waarden zijn UIT en AAN. SQL Server-transactiedoorvoeringen kunnen volledig duurzaam, de standaardinstelling of vertraagd duurzaam zijn. Zie Duurzaamheid van besturingstransacties voor meer informatie. |
De volgende SET-opties hebben dezelfde systeemstandaardwaarde voor alle atomische blokken in alle systeemeigen gecompileerde opgeslagen procedures:
| Optie instellen | Systeemstandaard voor atomische blokken |
|---|---|
| ANSI_NULLS | ON |
| ANSI_PADDING | ON |
| ANSI_WARNING | ON |
| ARITHABORT | ON |
| ARITHIGNORE | OFF |
| CONCAT_NULL_YIELDS_NULL | ON |
| IDENTITY_INSERT | OFF |
| NOCOUNT | ON |
| NUMERIC_ROUNDABORT | OFF |
| QUOTED_IDENTIFIER | ON |
| ROWCOUNT | 0 |
| TEXTSIZE | 0 |
| XACT_ABORT | OFF Ongecontroleerde uitzonderingen zorgen ervoor dat het atomische blok wordt teruggedraaid, maar niet dat de transactie wordt afgebroken, tenzij de fout de transactie fataal wordt. |