【问题标题】:What is the result when calling BEGIN TRANS, but not COMMIT, ROLLBACK, or END TRANS?调用 BEGIN TRANS 而不是 COMMIT、ROLLBACK 或 END TRANS 的结果是什么?
【发布时间】:2009-06-25 06:47:52
【问题描述】:

在显式事务中,如果我通过提供 BEGIN TRANS 开始事务,但如果我不提供 COMMIT、ROLLBACK 或 END TRANS,那么应用程序会发生什么?

【问题讨论】:

  • 标题真的很糟糕...尝试更具描述性的内容

标签: sql-server sql-server-2008 transactions


【解决方案1】:

什么都没有 - 交易仍在进行中。如果您终止连接,则会回滚。

【讨论】:

    【解决方案2】:

    因为您的事务可能会锁定部分数据库,您可能会导致其他事务/查询阻塞,直到您发出这些命令之一。

    在某些时候,交易必须以某种方式完成。当出现“错误”(例如应用程序结束)时,它将被回滚,除非您先提交它。

    【讨论】:

      【解决方案3】:

      如果应用程序退出,则连接会隐式关闭并回滚。

      如果应用程序在应用程序服务器(例如 ASPNET、Java 应用程序服务器等)中运行,则连接可能会返回到池中,希望它在再次使用之前被重置,并且事务最终会回滚(但也许不是立即)。

      如果未使用的连接位于池中,它最终可能会被应用服务器关闭,此时事务肯定会回滚。

      小心保持打开的事务太久 - 您将持有锁(如果您已更改任何内容)并阻止清理旧行,这可能对具有大量“流失”的数据库产生非常不利的影响”。

      【讨论】:

        【解决方案4】:

        如果您让交易处于打开状态,您最终会出现不良行为。如果您的应用程序返回池的连接时它没有回滚,您将有一个阻塞事务。 如果回滚,您的工作将丢失。无论哪种方式,这都不是您在生产环境中想要的行为。

        /哈坎·温瑟

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-14
          • 1970-01-01
          • 2011-12-17
          • 1970-01-01
          相关资源
          最近更新 更多