Si j'exécute ce qui suit :
CREATE TABLE t1
(a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
(a INT NOT NULL REFERENCES t1(a));
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
et après cela, j'exécute ceci :
SET XACT_ABORT ON;
BEGIN TRANSACTION
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) -- Foreign key error, entire transaction rolled back
INSERT INTO t2 VALUES (3)
COMMIT TRANSACTION
alors tout va bien ; la transaction est annulée parce que nous n'avons pas la valeur 2 dans t1 et par conséquent la table t2 est vide
Mais si j'ajoute un GO
au milieu de cette transaction, la transaction n'est pas annulée et le numéro 3 est inséré dans la table t2. Voici le code :
SET XACT_ABORT ON;
BEGIN TRANSACTION
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) -- Foreign key error.
GO --this command breaks the transaction
INSERT INTO t2 VALUES (3)
COMMIT TRANSACTION
Je sais que GO
n'est pas une instruction SQL mais plutôt une commande utilitaire de SQL Server Management Studio qui n'est pas réellement envoyée au serveur SQL.
C'est pourquoi, après avoir exécuté le dernier extrait de code ci-dessus (celui qui inclut la commande GO), je peux voir le numéro 3 dans le tableau t2.
J'ai utilisé SQL Server Management Studio