【发布时间】:2014-04-25 23:39:32
【问题描述】:
我有这笔交易:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
delete from Versions;
insert into Versions(Version) VALUES('1.0.0.0');
GO
ALTER TABLE dbo.MyTable ADD
MyNewColumn varchar(1000) NULL
ALTER TABLE dbo.MyTable SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
第一次版本表是空的,在 MyTable 中我有列“MyNewColumn”,所以当我尝试添加新列时出现错误。但是,当我执行脚本时,表格 Versions 有一条记录数据库的版本。
为什么?如果我正在使用事务并且我只有一个提交,那么我认为任何语句都不会在数据库中进行更改。
我希望如果其中一个语句失败,任何语句都不能更改数据库。
P.D.:我知道我可以在尝试添加之前检查该列是否存在,但我想知道为什么交易会像我预期的那样工作。
谢谢。
【问题讨论】:
-
事务将执行所有操作,但直到最后才会提交。因此插入将插入一条未提交的记录,该记录将在您的事务范围内可见。如果您期望错误将代码包装在 try catch 块中并处理它们
-
要补充 Tanner 所说的内容,您需要捕获错误并发出明确的 ROLLBACK。出现错误时事务不会自动回滚。你需要这样做。
标签: sql-server transactions batch-processing