私は次のことを実行した場合:GOコマンドの奇妙な行動
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
をし、その後、私はこれを実行します。
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
を、その後何もokです。 t1に値2がなく、結果としてテーブルt2が空であるため、トランザクションはロールバックされます。
このトランザクションの途中でGO
コマンドを追加すると、トランザクションはロールバックされず、番号3テーブルt2に挿入される。ここでは、コードは次のようになります。
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
私はGO
は、SQL文ではなく、実際にSQLサーバに送信されていないSQL Server Management Studioのユーティリティコマンドではないことを知っています。
ので、(GOコマンドを含むもの)の上に最後のコードスニペットを実行した後、私はSET XACT_ABORT
がON
あるとき、私はSQL Server Management Studioの
これは予想される動作とは完全に一致しています。 「GO」がどのように機能するのか、あなたの誤解かもしれません。 'batch'についてもっと理解するためにhttps://msdn.microsoft.com/en-us/library/ms188037.aspx?f=255&MSPPError=-2147217396を参照してください – techspider
ポイント:' GO'は***をしません***ブレークトランザクション。トランザクションは、バッチレベルではなくセッションレベルの成果物です。 SSMSの 'GO'は、セッションではなくバッチを分割します。 – RBarryYoung