SQL 服务器在事务中部分提交

SQL Server Partial commit in transaction

我有一个事务和两个 tables,我要在其中插入一些数据,我可以在 SQL 服务器

中进行部分提交吗
BEGIN TRANSACTION tran1
  BEGIN  TRY
    --Insert into Table1
    --Insert into Table2
COMMIT TRANSACTION  tran1                           
  END TRY
BEGIN CATCH
   ROLLBACK TRANSACTION tran1 
END CATCH

上面的代码会回滚两个table的数据,有没有办法我们可以提交table 1如果table 1没有错误插入但回滚table 2 如果发生任何错误。

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

答案是肯定的,尽管事务确实是原子的,但您可以使用 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

您可能需要调整广告顺序。