嵌套事务无法回滚

Dan*_*all 5 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;
Run Code Online (Sandbox Code Playgroud)

rollback transaction xx;,我收到消息

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

我在这里做错了什么?

更新来解释这个场景:

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

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

  • 如果用户特定的表以某种方式损坏,则不应回滚整个产品升级过程。

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

wir*_*ext 2

参考

你必须在CATCH块内使用这条线

ROLLBACK TRANSACTION; 
Run Code Online (Sandbox Code Playgroud)

这将回滚所有事务,当您在上面的语句(发布在 Q 中)中使用此事务时,它将给我们错误

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

为此,您必须将此行放入TRY块中

COMMIT TRANSACTION oo;
Run Code Online (Sandbox Code Playgroud)

最后你的声明是这样的

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;
Run Code Online (Sandbox Code Playgroud)

评论后更新

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;
Run Code Online (Sandbox Code Playgroud)