gpt4 book ai didi

sql - 嵌套事务无法回滚

转载 作者:行者123 更新时间:2023-12-04 16:19:53 24 4
gpt4 key购买 nike

我有 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 The current transaction cannot be committed and cannot be rolled back to a savepoint. Roll back the entire transaction.



我在这里做错了什么?

更新 解释场景:
  • 有一个大事务“oo”,它将数据库的表结构从产品版本X 更改为产品版本Y。
  • 在嵌套事务中,特定于用户的表应该是 试过 要更改(= 内部事务)。
  • 如果用户特定的表以某种方式损坏,则不应回滚整个产品升级过程。
  • 另一方面,如果在主产品表升级(外部事务)期间出现其他问题,则不应升级用户特定表。
  • 最佳答案

    Reference

    你必须在 CATCH 里面使用这条线堵塞

    ROLLBACK TRANSACTION; 

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

    The COMMIT TRANSACTION request has no corresponding 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;

    关于sql - 嵌套事务无法回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35293934/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com