Fonctionnement de la transaction dans INSERT unique avec plusieurs valeurs dans SQL Server

Je veux m'assurer d'insert 2 lignes en même time. Si j'exécute 2 requêtes INSERT simultanément comme ceci

 CREATE TABLE [dbo].[Table_test2] ( [column1] [int] NOT NULL , [column2] [int] NOT NULL , PRIMARY KEY(column1, column2) ) -- column1 & column2 = primary key --query 1 BEGIN TRAN INSERT INTO Table_test(column1, column2) VALUES (1,1) INSERT INTO Table_test(column1, column2) VALUES (2,2) COMMIT TRAN --query 2 BEGIN TRAN INSERT INTO Table_test(column1, column2) VALUES (2,2) INSERT INTO Table_test(column1, column2) VALUES (1,1) COMMIT TRAN 

Je pense que query1 et query2 échoueront. Comme la table sera déverrouillée après la première instruction INSERT , query1 et query2 réussiront à insert la première ligne. Mais lorsque chaque requête insère la deuxième instruction INSERT , elle ne fonctionne pas correctement.

Donc, je vais changer la requête comme ça. Est-ce que c'est bon?

Si la première requête fonctionne correctement, la deuxième requête peut être ignorée.

 --query 1 BEGIN TRAN INSERT INTO Table_test(column1, column2) VALUES (1,1), (2,2) COMMIT TRAN --query 2 BEGIN TRAN INSERT INTO Table_test(column1, column2) VALUES (2,2), (1,1) COMMIT TRAN 

Je me request si j'utilise une instruction INSERT unique avec plusieurs valeurs, est-ce que cela garantit l'insertion de 2 lignes à une transaction?

ps désolé, je ne suis pas bon à l'anglais

tout ce qui est après Begin Tran sera exécuté totalement ou tout échouera .. Donc votre clause de valeurs échouera également ..

De documents officiels (mine d'emphase)

BEGIN TRANSACTION représente un point auquel datatables référencées par une connection sont logiquement et physiquement cohérentes. Si des erreurs sont rencontrées, toutes les modifications de données effectuées après BEGIN TRANSACTION peuvent être annulées pour renvoyer datatables à cet état de cohérence connu .

donc ça n'a pas d'importance, si vous faites une clause ou si vous séparez DML, tout échouera ..

Je me request si j'utilise une instruction INSERT unique avec plusieurs valeurs, est-ce que cela garantit l'insertion de 2 lignes à une transaction?

même si vous n'utilisez pas ces déclarations entières entre ces deux clauses seront logiquement sous une seule transaction

En outre, la clause de valeurs est juste du sucre syntaxique, cela fonctionne comme des instructions d'insertion séparées sous le capot, vous pouvez voir la même chose par la capture d'écran ci-dessous

entrez la description de l'image ici