BEGIN TRANSACTION (Transact-SQL)
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Warehouse dans microsoft Fabric SQL Database dans Microsoft Fabric SQL Database dans Microsoft Fabric
Indique le début d'une transaction locale explicite. Les transactions explicites commencent par l’instruction BEGIN TRANSACTION
et se terminent par l’instruction ou ROLLBACK
l’instructionCOMMIT
.
Conventions de la syntaxe Transact-SQL
Syntaxe
Syntaxe pour SQL Server, Azure SQL Database et Azure SQL Managed Instance.
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Syntaxe de Synapse Data Warehouse dans Microsoft Fabric, Azure Synapse Analytics and Analytics Platform System (PDW).
BEGIN { TRAN | TRANSACTION }
[ ; ]
Arguments
transaction_name
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database et Azure SQL Managed Instance
Nom attribué à la transaction. transaction_name devez respecter les règles des identificateurs, mais les identificateurs de plus de 32 caractères ne sont pas autorisés. Utilisez des noms de transaction uniquement sur la paire la plus externe d’instructions imbriquées ou BEGIN...ROLLBACK
imbriquéesBEGIN...COMMIT
. transaction_name respecte toujours la casse, même si l’instance de SQL Server n’est pas sensible à la casse.
@tran_name_variable
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database et Azure SQL Managed Instance
Nom d’une variable définie par l’utilisateur contenant un nom de transaction valide. La variable doit être déclarée avec un type de données char, varchar, nchar ou nvarchar. Si plus de 32 caractères sont passés à la variable, seuls les 32 premiers caractères sont utilisés. Les caractères restants sont tronqués.
WITH MARK [ 'description' ]
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database et Azure SQL Managed Instance
Indique que la transaction est marquée dans le journal. description est une chaîne qui décrit la marque. Une description supérieure à 128 caractères est tronquée à 128 caractères avant d’être stockée dans la msdb.dbo.logmarkhistory
table.
Si WITH MARK
elle est utilisée, un nom de transaction doit être spécifié. WITH MARK
permet de restaurer un journal des transactions sur une marque nommée.
Notes
BEGIN TRANSACTION
incrémente @@TRANCOUNT
par 1
.
BEGIN TRANSACTION
représente un point auquel les données référencées par une connexion sont logiquement et physiquement cohérentes. Si des erreurs sont rencontrées, toutes les modifications apportées aux données après la BEGIN TRANSACTION
restauration des données peuvent être restaurées pour renvoyer les données à cet état de cohérence connu. Chaque transaction dure jusqu’à ce qu’elle se termine sans erreur et COMMIT TRANSACTION
qu’elle soit émise pour apporter aux modifications une partie permanente de la base de données, ou que toutes les modifications sont effacées avec une ROLLBACK TRANSACTION
instruction.
BEGIN TRANSACTION
démarre une transaction locale pour la connexion qui émet l’instruction. Selon les paramètres de niveau d’isolation des transactions actuels, de nombreuses ressources acquises pour prendre en charge les instructions Transact-SQL émises par la connexion sont verrouillées par la transaction jusqu’à ce qu’elle se termine avec une ou ROLLBACK TRANSACTION
une COMMIT TRANSACTION
instruction. Les transactions suspendues pendant de longues périodes de temps peuvent empêcher les autres utilisateurs d'accéder à ces ressources verrouillées, et elles peuvent également empêcher la troncature du fichier journal.
Bien qu’elle BEGIN TRANSACTION
démarre une transaction locale, elle n’est pas enregistrée dans le journal des transactions tant que l’application n’effectue pas ensuite une action qui doit être enregistrée dans le journal, telle que l’exécution d’une instruction, ou DELETE
l’exécution d’une INSERT
UPDATE
instruction. Une application peut effectuer des actions telles que l’acquisition de verrous pour protéger le niveau d’isolation des transactions des SELECT
instructions, mais rien n’est enregistré dans le journal tant que l’application n’a pas effectué une action de modification.
L'attribution d'un nom à plusieurs transactions d'une série de transactions imbriquées a peu d'effet sur la transaction. En effet, seul le premier nom de transaction (le plus à l'extérieur) est inscrit avec le système. Une annulation vers tout autre nom (autre que celui d'un point de sécurité valide) génère une erreur. Dans ce cas, aucune des instructions exécutées avant l'annulation n'est en fait annulée au moment où l'erreur se produit. Les instructions ne sont annulées que lorsque l'instruction extérieure est elle-même annulée.
La transaction locale démarrée par l’instruction BEGIN TRANSACTION
est réaffectée à une transaction distribuée si les actions suivantes sont effectuées avant la validation ou la restauration de l’instruction :
Une
INSERT
instruction ou uneUPDATE
DELETE
instruction qui fait référence à une table distante sur un serveur lié est exécutée. L’instructionINSERT
ou l’instructionUPDATE
DELETE
échoue si le fournisseur OLE DB utilisé pour accéder au serveur lié ne prend pas en charge l’interfaceITransactionJoin
.Un appel est effectué vers une procédure stockée distante lorsque l’option
REMOTE_PROC_TRANSACTIONS
est définie surON
.
La copie locale de SQL Server devient le contrôleur de transaction et utilise Microsoft DTC pour gérer la transaction distribuée.
Une transaction peut être exécutée explicitement en tant que transaction distribuée à l’aide BEGIN DISTRIBUTED TRANSACTION
de . Pour plus d’informations, consultez BEGIN DISTRIBUTED TRANSACTION.
Quand SET IMPLICIT_TRANSACTIONS
la valeur est définie ON
, une BEGIN TRANSACTION
instruction crée deux transactions imbriquées. Pour plus d'informations, consultez SET IMPLICIT_TRANSACTIONS.
Transactions marquées
L’option WITH MARK
entraîne le fait que le nom de la transaction soit placé dans le journal des transactions. Lorsque vous restaurez une base de données à un état antérieur, la transaction marquée peut être utilisée à la place d’une date et d’une heure. Pour plus d’informations, consultez Utiliser des transactions marquées pour récupérer des bases de données associées de manière cohérente et des instructions RESTORE.
En outre, les marques du journal des transactions sont nécessaires pour récupérer un ensemble de bases de données connexes dans un état cohérent d'un point de vue logique. Une transaction distribuée permet de placer des marques dans les journaux de transactions des bases de données connexes. La récupération de l'ensemble de bases de données connexes jusqu'à ces marques aboutit à un ensemble de bases de données cohérent d'un point de vue transactionnel. Le placement de marques dans des bases de données connexes implique des procédures particulières.
La marque n'est placée dans le journal des transactions que si la base de données est mise à jour par la transaction marquée. Les transactions qui ne modifient pas les données ne sont pas marquées.
BEGIN TRANSACTION <new_name> WITH MARK
peut être imbriqué dans une transaction déjà existante qui n’est pas marquée. Dans ce cas, <new_name>
devient le nom de marque de la transaction, malgré le nom que la transaction a déjà été donnée. Dans l'exemple suivant, M2
est le nom de la marque.
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
Lorsque vous imbriquez des transactions, vous recevez le message d’avertissement suivant si vous essayez de marquer une transaction déjà marquée :
Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.
autorisations
Nécessite l'appartenance au rôle public .
Exemples
Les exemples de code Transact-SQL de cet article sont fondés sur l’échantillon de base de données AdventureWorks2022
ou AdventureWorksDW2022
fourni, que vous pouvez télécharger à partir de la page d’accueil Échantillons et projets communautaires Microsoft SQL Server.
R : Utiliser une transaction explicite
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. Restauration d’une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics, Analytics Platform System (PDW)
L’exemple suivant montre l’effet de la restauration d’une transaction. Dans cet exemple, l’instruction ROLLBACK
restaure l’instruction INSERT
, mais la table créée existe toujours.
CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
ROLLBACK;
C. Nommer une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance
L'exemple suivant montre comment nommer une transaction.
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
D. Marquer une transaction
S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures, Azure SQL Database, Azure SQL Managed Instance
L'exemple suivant montre comment marquer une transaction. La transaction CandidateDelete
est marquée.
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2022;
GO
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO