嵌套事务无法回滚

时间:2016-02-09 13:58:40

标签: sql sql-server transactions

我有SQL Server 2008并希望进行这样的交易:

begin transaction oo;

......

begin try        
    save transaction xx;
    alter table ....; -- this will fail
    alter table ....;
    alter table ....;
end try
begin catch  
    rollback transaction xx; -- error here
end catch;

......

commit transaction oo;

rollback transaction xx;,我收到消息

  

3931无法提交当前事务,也无法回滚到保存点。回滚整个交易。

我在这里做错了什么?

更新解释方案:

  • 有一个大事务" oo",它会将数据库的表结构从产品版本X更改为产品版本Y.

  • 在嵌套事务中,应该尝试更改用户特定表(=内部事务)。

  • 如果特定于用户的表被破坏,则不应回滚整个产品升级过程。

  • 另一方面,如果在主产品表升级(外部事务)期间出现其他问题,则不应升级用户特定表。

1 个答案:

答案 0 :(得分:1)

Reference

你必须在CATCH

中使用这一行
ROLLBACK TRANSACTION; 

将回滚所有交易, 当你在上面的陈述中使用这个(在Q中发布)然后它会 给我们错误

  

COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION。

因为你必须把这一行放在TRY

COMMIT TRANSACTION oo;

然后最后你的陈述

BEGIN TRANSACTION oo;

BEGIN TRY        
    SAVE TRANSACTION xx;
    CREATE TABLE test (ID INT); -- this will fail from second time
    SELECT 3;

    COMMIT TRANSACTION oo;
END TRY

BEGIN catch  

    ROLLBACK TRANSACTION; 
END CATCH;
评论后

更新

BEGIN TRY        
    BEGIN TRANSACTION xx1;
    select 1; -- this will always success
    COMMIT TRANSACTION xx1;

    BEGIN TRANSACTION xx2;
    CREATE TABLE test (id int); -- this will fail from second time
    COMMIT TRANSACTION xx2;

    BEGIN TRANSACTION xx3;
    select 3; -- this will fail from second time
    COMMIT TRANSACTION xx3;


END TRY

BEGIN catch  

    ROLLBACK TRANSACTION 
END CATCH;