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