1

我需要从 SQL Server 2008 中的 2 个表中删除数据。

我有两个表 A 和 B。我需要将每个表放在一个单独的事务中。

这是我正在使用的代码。

BEGIN TRANSACTION;
BEGIN TRY
    DELETE      from A
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;


BEGIN TRANSACTION;
BEGIN TRY
    DELETE     from B
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;

有没有更好的方法在 SQL Server 中实现多个事务和错误处理?

我需要为每个表放置单独的事务。

当其中一项交易失败时,我收到错误消息。

EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。记录没有从其他事务中删除

4

3 回答 3

7

尝试这个:

BEGIN TRANSACTION;
BEGIN TRY
    DELETE from A
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH


BEGIN TRANSACTION;
BEGIN TRY
    DELETE     from B
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
END CATCH
于 2012-08-27T06:29:50.377 回答
0

也许你可以这样做:

BEGIN TRANSACTION one;
BEGIN TRY
    DELETE      from A
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION one;

END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION one;


BEGIN TRANSACTION two;
BEGIN TRY
    DELETE     from B
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION two;
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION two;
于 2012-08-27T06:49:46.997 回答
0

每个查询都在一个隐式事务中,因此单个查询的显式事务是多余的。DELETE 将删除所有记录或不删除任何记录,而不是其中一些记录,然后失败。

如果两个删除查询需要一起成功或失败,则需要显式事务。

如果这些是巨大的表,那么在没有显式事务的情况下一次删除几条记录会更有效。(多次这样做。)但是,如果它必须是单个事务,则将单独的较小删除放在较大的事务中不会防止事务日志膨胀。我不知道在这种情况下它是否会更快。在过去,我记得使用单个事务可能需要数小时而不是数分钟才能完成该过程。在一种情况下,它永远不会完成......几天后我们放弃了。

于 2021-12-09T01:04:53.883 回答