SQL Server部分提交事务

问题描述

我有一个事务和两个要在其中插入一些数据的表,我可以在sql Server中进行部分提交吗

BEGIN TRANSACTION tran1
  BEGIN  TRY
    --Insert into Table1
    --Insert into Table2
COMMIT TRANSACTION  tran1                           
  END TRY
BEGIN CATCH
   ROLLBACK TRANSACTION tran1 
END CATCH

以上代码将回滚两个表的数据,如果表1插入没有错误,可以回退表2,如果发生任何错误,可以回退表2。

解决方法

答案是肯定的,尽管交易确实是原子的,但您可以使用savepoint。因此,在您的情况下,代码可能看起来像这样(未经测试):

BEGIN  TRY
    BEGIN TRANSACTION
    --Insert into Table1

    -- savepoint
    SAVE TRANSACTION tran1

    --Insert into Table2

    -- commit the whole transaction
    COMMIT TRANSACTION
END TRY

BEGIN CATCH
    -- rollback to savepoint
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION tran1 
END CATCH

您可能需要调整插入顺序。

,

不,你不能。 事务是原子的。也就是说,所有步骤都作为一个步骤执行,一起提交或回滚。 如果将两个插入都放在一个事务中,则不能提交到一个表。 可能的话,您可以使用其他交易。