Blocs atomiques dans des procédures en mode natif
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 en mode non natif et les lots ad hoc ne prennent pas en charge les blocs Atomic.
Les blocs Atomic sont exécutés (atomiquement) dans 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 fixes pour le bloc Atomic. Le fait d'exécuter le même bloc Atomic dans des sessions avec des paramètres différents génère 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 la transaction reste active), le démarrage d’un bloc Atomic crée 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 restaurés, mais la transaction au niveau de la session se poursuit, à moins que l'exception ne condamne la transaction. Par exemple, un conflit d'écriture condamne 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 en dehors de l'étendue du bloc, la transaction est validée à la fin du bloc. Si le bloc lève une exception (autrement dit, l'exception n'est pas interceptée et n'est pas gérée dans le bloc), la transaction est restaurée. Pour les transactions couvrant un bloc Atomic (une procédure stockée compilée en mode natif), vous n’avez pas besoin d’écrire d’instructions BEGIN TRANSACTION anetd COMMIT ou ROLLBACK explicites.
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 Atomic 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 apparaissent dans l’étendue d’un bloc Atomic, 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 Atomic sont fixes 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. Lorsqu'il est spécifié, DATEFORMAT remplace le format de date par défaut associé à LANGUAGE. |
DATEFIRST | Lorsqu'il est spécifié, 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, par défaut ou retardés. Pour plus d’informations, voir Contrôler la durabilité des transactions. |
Les options SET suivantes ont la même valeur système par défaut pour tous les blocs Atomic de toutes les procédures stockées compilées en mode natif :
Option SET | Valeur système par défaut pour les blocs Atomic |
---|---|
ANSI_NULLS | ACTIVÉ |
ANSI_PADDING | ACTIVÉ |
ANSI_WARNING | ACTIVÉ |
ARITHABORT | ACTIVÉ |
ARITHIGNORE | OFF |
CONCAT_NULL_YIELDS_NULL | ACTIVÉ |
IDENTITY_INSERT | OFF |
NOCOUNT | ACTIVÉ |
NUMERIC_ROUNDABORT | OFF |
QUOTED_IDENTIFIER | ACTIVÉ |
ROWCOUNT | 0 |
TEXTSIZE | 0 |
XACT_ABORT | OFF Les exceptions qui ne sont pas interceptées entraînent la restauration des blocs Atomic, mais pas l'abandon de la transaction, sauf si l'erreur condamne la transaction. |