代码之家  ›  专栏  ›  技术社区  ›  Ahmed

如果回滚超时,SQL是否进行隐式回滚?

  •  2
  • Ahmed  · 技术社区  · 16 年前

    我有一个dotnet应用程序,它以事务方式执行一组insert、update、delete语句。

    密码是这样的

    try
    {
    mytrans = mycon.begintransaction();
    //execute sql statements
    mytrans.commit();
    }
    catch(Exception)
    {
    mytrans.rollback();
    }
    

    问题是我们在回滚时有时会遇到超时异常,我发现数据库大小(MDF文件)增加了!!! 所以这意味着SQL不会进行隐式回滚?如果是,如何从该错误中恢复并转到原始状态????

    4 回复  |  直到 16 年前
        1
  •  2
  •   Michael Borgwardt    16 年前

    事务的基本概念要求未提交的事务不会影响数据库的状态。

    文件大小没有任何意义。RDBMS数据结构比简单地向文件添加一行要复杂得多——它们包括日志和索引,因此文件可以独立于数据库中的数据量增长和收缩。

        2
  •  1
  •   AnthonyWJones    16 年前

    可能已执行的任何SQL都尚未提交。如果您的回滚由于某种原因而超时,则不会导致提交。因此,最终,DB将认识到它所有的一切都已过时,并将放弃这些变化。

    MDF大小的增加并不表示事务已提交。然而,事务的结果需要放在某个地方。提交事务应该要求数据库中尽可能少的更改。因此,可以分配页面并写入数据,然后在提交时,只需要调整其他一些指向所有正确位置的位。

    如果有一个回滚,那么最后几个位就不会被调整,那些分配的页面就变成了可用于其他事情的空闲页面。你不能指望数据库会再次收缩。

        3
  •  0
  •   A-K    16 年前

    页面狭缝可以在回滚中存活:

    http://sqlfool.com/2009/04/page-splitting-rollbacks/

        4
  •  0
  •   RBarryYoung    16 年前

    回滚一旦启动,就必须完成。无论您是否仍然连接,SQL Server仍将完成回滚。无法完成回滚会导致数据库事务性损坏,需要恢复。