Share via


Atomische blokken in systeemeigen procedures

Van toepassing op:SQL ServerAzure SQL DatabaseAzure 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.

Zie ook

Systeemeigen gecompileerde opgeslagen procedures