2

我在 SQL Server 2005 中这样做。我有一个表,只有一个 int 类型的列,你不能在其中插入 char。

如果我运行它,我将在我的表中插入一行。

INSERT INTO TestTable VALUES(3)   --success 
INSERT INTO TestTable VALUES('b') --fail, cannot insert char

如果我运行它,我将在我的表中插入零行。因此,事务将 2 个任务组合成一个执行单元。如果一项任务失败,则整个事务都会失败。

BEGIN TRANSACTION 
INSERT INTO TestTable VALUES(3)
INSERT INTO TestTable VALUES('b')
COMMIT TRANSACTION

我的问题是: ROLLBACK TRANSACTION 似乎没用,因为我在上面的代码中没有 ROLLBACK 但它仍然被回滚......有人可以帮助我理解这一点吗?

4

1 回答 1

0

在 SQL Server 中,默认情况下所有代码都在隐式事务中运行。如果您在一批中提交两个语句并且您启用了查询选项 XACT_ABORT,那么任何失败都应该回滚整个事务。默认行为是仅回滚导致错误的语句。如果您分批提交语句(通过在 SSMS 中单独突出显示它们并按 F5 或在其间放置“go”语句),我认为您会看到不同的行为。

于 2012-05-08T01:45:24.483 回答