Partager via


Blocs atomiques

BEGIN ATOMIC fait partie de la norme ANSI SQL. SQL Server prend en charge les blocs atomiques uniquement au niveau supérieur des procédures stockées compilées en mode natif.

  • Chaque procédure stockée compilée en mode natif contient exactement un bloc d’instructions Transact-SQL. Il s’agit d’un bloc atomic.

  • Les procédures stockées non natives interprétées (Transact-SQL) et les lots ad hoc ne prennent pas en charge les blocs atomiques.

Les blocs atomiques sont exécutés de manière atomique au sein de la transaction. Toutes les instructions du bloc réussissent ou la totalité du bloc est restaurée sur le point d’enregistrement créé au début du bloc. En outre, les paramètres de session sont fixés pour le bloc atomique. L’exécution du même bloc atomique dans les sessions avec différents paramètres entraîne le même comportement, indépendamment des paramètres de la session active.

Transactions et gestion des erreurs

Si une transaction existe déjà dans une session (car un lot a exécuté une instruction BEGIN TRANSACTION et que la transaction reste active), le lancement d’un bloc atomique créera un point de sauvegarde au sein de la transaction. Si le bloc se ferme sans exception, le point d’enregistrement créé pour les validations de bloc, mais la transaction n’est pas validée tant que la transaction n’est pas validée tant que la transaction n’a pas été validée au niveau de la session. Si le bloc lève une exception, les effets du bloc sont annulés, mais la transaction au niveau de la session se poursuit, sauf si l’exception est de nature à entraîner l’échec de la transaction. Par exemple, un conflit d’écriture peut être fatal pour la transaction, alors qu'une erreur de conversion de type ne l'est pas.

S’il n’existe aucune transaction active sur une session, BEGIN ATOMIC démarre une nouvelle transaction. Si aucune exception n’est levée en dehors du bloc, la transaction sera validée à la fin du bloc. Si le bloc lève une exception, c'est-à-dire si l’exception n’est pas interceptée et gérée dans le bloc, la transaction sera annulée. Pour les transactions qui s’étendent sur un bloc atomique unique (une seule procédure stockée compilée en mode natif), vous n'avez pas besoin d’écrire explicitement des instructions BEGIN TRANSACTION, COMMIT ou ROLLBACK.

Les procédures stockées compilées en mode natif prennent en charge les constructions TRY, CATCH et THROW pour la gestion des erreurs. La fonction RAISERROR n'est pas prise en charge.

L’exemple suivant illustre le comportement de gestion des erreurs avec des blocs atomiques et des procédures stockées compilées en mode natif :

-- 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  

Les messages d’erreur suivants spécifiques aux tables mémoire optimisées sont des transactions qui sont vouées à l’échec. S’ils se produisent dans la portée d’un bloc atomique, ils entraînent l’abandon de la transaction : 10772, 41301, 41302, 41305, 41325, 41332 et 41333.

Paramètres de session

Les paramètres de session au sein des blocs atomiques sont fixés lorsque la procédure stockée est compilée. Certains paramètres peuvent être spécifiés BEGIN ATOMIC alors que d’autres paramètres sont toujours fixes à la même valeur.

Les options suivantes sont requises avec BEGIN ATOMIC:

Paramètre requis Descriptif
TRANSACTION ISOLATION LEVEL Les valeurs prises en charge sont SNAPSHOT, REPEATABLEREADet SERIALIZABLE.
LANGUAGE Détermine les formats de date et d’heure et les messages système. Tous les langages et alias dans sys.syslanguages (Transact-SQL) sont pris en charge.

Les paramètres suivants sont facultatifs :

Paramètre facultatif Descriptif
DATEFORMAT Tous les formats de date SQL Server sont pris en charge. Quand elle est spécifiée, DATEFORMAT remplace le format de date par défaut associé à LANGUAGE.
DATEFIRST Quand elle est spécifiée, DATEFIRST remplace la valeur par défaut associée à LANGUAGE.
DELAYED_DURABILITY Les valeurs prises en charge sont OFF et ON.

Les validations de transaction SQL Server peuvent être entièrement durables, la valeur par défaut ou la durabilité retardée. Pour plus d’informations, consultez Contrôle de la durabilité des transactions.

Les options SET suivantes ont la même valeur par défaut système pour tous les blocs atomiques dans toutes les procédures stockées compilées en mode natif :

Définir l’option Valeur par défaut du système pour les blocs atomiques
ANSI_NULLS ACTIVÉ
ANSI_PADDING ACTIVÉ
ANSI_WARNING ACTIVÉ
ARITHABORT ACTIVÉ
ARITHIGNORE ÉTEINT
CONCATÉNER_NULL_DONNE_NULL ACTIVÉ
IDENTITY_INSERT ÉTEINT
NOCOUNT ACTIVÉ
NUMERIC_ROUNDABORT ÉTEINT
IDENTIFIANT_CITÉ ACTIVÉ
Nombre de lignes 0
TAILLE DU TEXTE 0
XACT_ABORT ÉTEINT

Les exceptions non capturées entraînent la restauration à l'état initial du bloc atomique, mais pas l’abandon de la transaction, sauf si elles rendent la transaction vouée à l’échec.

Voir aussi

Procédures stockées compilées en mode natif