如果我跑了以下內容:奇怪的行爲
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
那麼什麼是確定的;該交易回滾,因爲我們在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命令的)最後的代碼片斷後,我可以看到表t2 3號
我使用SQL Server Management Studio中
這絕對符合預期的行爲。這可能是你對'GO'如何工作的誤解。請參閱https://msdn.microsoft.com/en-us/library/ms188037.aspx?f=255&MSPPError=-2147217396以瞭解更多有關'批次'的信息。 – techspider
Point:'GO' does not *** not *** break交易。事務是會話級別的工件,而不是批次級別。 SSMS中的「GO」打破了一個批次,而不是一個會話。 – RBarryYoung