【发布时间】:2011-08-10 12:18:14
【问题描述】:
我有一些纯顺序流的代码,没有事务。 我将它们与开始事务和提交事务夹在中间
begin transaction
......--My code here......
......
......--code to create Table1
......
ALTER TABLE [dbo].[Table1] WITH CHECK ADD CONSTRAINT [FK_constraint] FOREIGN KEY([field1], [field2])
REFERENCES [dbo].[Table2] ([field3], [field4])
GO
....
......--End of My code here......
rollback transaction
commit transaction
当我在管理工作室中运行脚本直到刚好在“回滚事务”上方时,如果发生简单的错误,例如被零除,我运行“回滚事务”,所有更改都回滚没有问题。
但如果由于 Table2 不存在而导致 alter table 语句失败,则会触发更多错误。
消息 1767,第 16 级,状态 0,第 2 行 外键 'FK_Constraint 引用了无效的表 'dbo.Table2'。
消息 1750,第 16 级,状态 0,第 2 行 无法创建约束。查看以前的错误。
消息 1767,第 16 级,状态 0,第 2 行 外键“FK_xxxxxx”引用了无效的表“Table1”。
当我运行“回滚事务”时,我收到此错误消息“回滚事务请求没有相应的 BEGIN TRANSACTION。”这很愚蠢,因为我确实有一个开始交易!
请告诉我出了什么问题。任何帮助将非常感激。使用 SQL-Server 2008。
编辑:
我加了
SELECT @@TRANCOUNT;
“ALTER TABLE [dbo].[Table1] WITH CHECK ADD CONSTRAINT”之前和之后
....
SELECT @@TRANCOUNT;
ALTER TABLE [dbo].[Table1] WITH CHECK ADD CONSTRAINT [FK_constraint] FOREIGN KEY([field1], [field2]) REFERENCES [dbo].[Table2] ([field3], [field4])
GO
SELECT @@TRANCOUNT;
....
结果分别为 1 和 0。发生错误时,alter table 会自动回滚我的事务!?这个我看不懂。
【问题讨论】:
-
听起来您正在手动运行各个代码段。在第二组错误发生之前,您是否可能没有突出显示
begin transaction部分? -
是的,我正在手动运行它们。我确实在每次运行开始时突出显示了开始事务。
-
我想,那种DDL的异常,Sql Server会自动为你回滚事务;但真正令人失望的是它不会将控制权交还给您,您的代码无法执行优雅的执行,例如您的代码将无法检测到事务级别(通过
@@TranCount)
标签: sql tsql sql-server-2008