Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
BEGIN ATOMIC fait partie de la norme SQL ANSI. SQL Server prend en charge les blocs atomiques au niveau supérieur des procédures stockées compilées en mode natif, ainsi que des fonctions scalaires définies par l’utilisateur compilées en mode natif. Pour plus d’informations sur ces fonctions, consultez Fonctions scalaires définies par l’utilisateur pour l’OLTP en mémoire.
Chaque procédure stockée compilée en mode natif contient précisément un bloc d'instructions Transact-SQL. Il s'agit d'un bloc ATOMIC.
Les procédures stockées Transact-SQL interprétées, non natives, et les lots ad hoc ne prennent pas en charge les blocs atomiques.
Les blocs atomiques sont exécutés (atomiquement) au sein de la transaction. Toutes les instructions du bloc réussissent ou l'intégralité du bloc est restauré au point de sauvegarde créé au démarrage du bloc. En outre, les paramètres de session sont figés pour le bloc atomique. L’exécution du même bloc atomique dans des sessions avec des paramètres différents entraînera le même comportement, indépendamment des paramètres de la session en cours.
Transactions et gestion des erreurs
Si une transaction existe déjà sur une session (car un lot a exécuté une instruction BEGIN TRANSACTION et que la transaction est toujours active), alors le lancement d’un bloc atomique créera un point de sauvegarde dans la transaction. Si le bloc se termine sans exception, le point de sauvegarde créé pour le bloc est validé, mais la transaction ne sera pas validée avant la validation de la transaction 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, à moins que l'exception ne soit de nature à invalider la transaction. Par exemple, un conflit d’écriture entraîne l’échec de la transaction, mais pas une erreur de conversion de type.
S'il n'y a pas de transactions actives dans une session, BEGIN ATOMIC démarre une nouvelle transaction. Si aucune exception n'est levée hors de la portée du bloc, la transaction sera validée à la fin du bloc. Si le bloc lève une exception (c’est-à-dire que l’exception n’est ni interceptée ni gérée dans le bloc), la transaction sera annulée. Pour les transactions qui s’étendent sur un seul bloc atomique (une seule procédure stockée compilée en mode natif), vous n’avez pas besoin d’écrire explicitement des instructions BEGIN TRANSACTION et COMMIT ou ROLLBACK.
Les procédures stockées compilées en mode natif prennent en charge les constructions TRY, CATCHet THROW pour la gestion des erreurs. La fonctionRAISERROR n'est pas prise en charge.
L'exemple suivant illustre le comportement de gestion des erreurs avec les blocs atomiques et les 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 propres aux tables optimisées en mémoire condamnent les transactions. S’ils se produisent dans le cadre d’un bloc atomique, ils entraînent l’abandon de la transaction : 10772, 41301, 41302, 41305, 41325, 41332, 41333 et 41839.
Paramètres de session
Les paramètres de session dans les blocs atomiques sont définis lorsque la procédure stockée est compilée. Certains paramètres peuvent être spécifiés avec BEGIN ATOMIC tandis que les autres paramètres sont toujours fixes avec la même valeur.
Les options suivantes sont requises avec BEGIN ATOMIC:
| Paramètre obligatoire | Description |
|---|---|
| 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 les alias dans sys.syslanguages (Transact-SQL) sont pris en charge. |
Les paramètres suivants sont facultatifs :
| Paramètre facultatif | Description |
|---|---|
| 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. |
| DURABILITÉ_DIFFÉRÉE | Les valeurs prises en charge sont OFF et ON. Les validations de transactions SQL Server peuvent être soit entièrement durables (par défaut), soit à durabilité différée. Pour plus d’informations, voir Contrôler la durabilité des transactions. |
Les options suivantes SET 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 | Paramètre par défaut du système pour Atomic Blocks |
|---|---|
| ANSI_NULLS | ACTIVÉ |
| ANSI_PADDING | ACTIVÉ |
| ANSI_WARNING | ACTIVÉ |
| ARITHABORT | ACTIVÉ |
| ARITHIGNORE | Désactivé |
| CONCAT_NULL_YIELDS_NULL | ACTIVÉ |
| IDENTITY_INSERT | Désactivé |
| NOCOUNT | ACTIVÉ |
| NUMERIC_ROUNDABORT | Désactivé |
| QUOTED_IDENTIFIER | ACTIVÉ |
| ROWCOUNT | 0 |
| TEXTSIZE | 0 |
| XACT_ABORT | Désactivé Les exceptions non interceptées provoquent l’annulation du bloc atomique, mais n’interrompent pas la transaction, à moins que l’erreur ne rende la transaction irrécupérable. |