我们可以回滚而不说“回滚”?

时间:2012-05-07 21:33:32

标签: sql-server sql-server-2005 transactions

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

如果我运行这个,我会在表格中插入一行。

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

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

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

我的问题是:好像ROLLBACK TRANSACTION没用,因为我在上面的代码中没有ROLLBACK,但它仍然会回滚....有人能帮助我理解这个吗?

1 个答案:

答案 0 :(得分:0)

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