【问题标题】:if DDL statement fails whole transaction is rolled back sql server如果 DDL 语句失败整个事务回滚 sql server
【发布时间】:2025-12-31 10:30:11
【问题描述】:

我有一系列 DML 和 DDL(仅限 Drop View)语句,我需要在 VB.net 应用程序的单个事务下执行这些语句。我正在使用 commandObj,并且首先保留了我保留的 beginTransaction 语句。当 Drop 语句返回错误时,一切正常。如果 Drop 语句返回错误,则回滚整个事务。我不想要这个。即使 Drop 未能保留在 Drop 之前执行的其他 DML 语句,我也想继续。这可能吗?

提前致谢

【问题讨论】:

    标签: sql vb.net


    【解决方案1】:

    谢谢大家的回复。。

    实际上在执行 Drop View 之前已经检查了视图是否存在。只有当另一个用户锁定时才会出现下拉视图的问题。现在,当您在执行 drop view 后移动了所有 DML 事务时,即使 drop view 语句失败(这将回滚所有先前的事务),也不会有问题,因为这是正在执行的第一条语句。

    【讨论】:

      【解决方案2】:

      我不认为 DDL 语句是事务性的(即,如果发生错误,您不能回滚当前语句之前的语句)。

      查看错误发生的原因并为DROP VIEW修复它

      编辑:如果它可能是一个不存在的视图(尚未创建或删除),您可以使用 IF EXISTS (....) 语法。

      例如here

      【讨论】:

      • DDL 语句是否是事务性的因 RDBMS 而异。 SQL Server - 是的。 Oracle-No.
      • 澄清一下。 Oracle 中的 DDL 总是在它自己的事务中。各个 DDL 语句是事务性的。 (具有 ACID 属性。)但不能成为较大的多语句事务的一部分。与允许在多语句事务中进行 DDL 的 SQL Server 不同。
      【解决方案3】:

      然后根据需要在 COMMIT 和/或 ROLLBACK 语句之前或之后移动 DDL。

      【讨论】:

        【解决方案4】:

        单独执行您的语句,并根据需要处理错误(回滚或不回滚)。

        【讨论】:

          【解决方案5】:

          您可以在您的 sysobjects 视图中运行一个选择来检查该视图是否存在并仅在它存在时才将其删除。

          您也可以在存储过程中使用 try ... catch。

          像其他人提到的那样,您也可以在事务之前删除视图。

          或者也许您可以使用临时表而不是视图,但这实际上取决于您的需求和需要完成的工作。

          【讨论】:

            最近更新 更多