gpt4 book ai didi

sql - 事务中 GO 命令的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 14:01:04 26 4
gpt4 key购买 nike

如果我运行以下命令:

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 Server Management Studio 实用程序命令,它实际上并没有发送到 SQL Server。

那么,为什么在运行上面的最后一个代码片段(包含 GO 命令的那个)之后,我可以在表 t2 中看到数字 3

我使用了 SQL Server Management Studio

最佳答案

When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.

在第一批中打开的事务确实在出错时自动回滚。

然后 SSMS 看到有另一个批处理要处理并触发

INSERT INTO t2 VALUES (3)

COMMIT TRANSACTION

由于第一个事务现已关闭,这将启动一个新的自动提交事务。最后有一个意外的 COMMIT TRANSACTION 从而引发错误。

您可以更改第二批以检查第一批中的事务是否被毫不客气地回滚。

SET XACT_ABORT ON; 

BEGIN TRANSACTION
INSERT INTO t2 VALUES (1)

INSERT INTO t2 VALUES (2) -- Foreign key error.

GO

IF @@TRANCOUNT = 0
BEGIN
RAISERROR('Transaction closed',16,1);
RETURN;
END

INSERT INTO t2 VALUES (3)

COMMIT TRANSACTION

或者你可以打开SQLCMD模式并使用

:on error exit

如果您不想在出错后处理更多批处理。

enter image description here

关于sql - 事务中 GO 命令的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37819333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com