2

我有一个 dotnet 应用程序,它以事务方式执行一组插入、更新、删除语句

代码是这样的

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

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

4

4 回答 4

2

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

文件大小并不意味着什么。RDBMS 数据结构远比简单地向文件中添加一行要复杂得多——它们包括日志和索引,因此文件可以完全独立于数据库中的数据量而增长和缩小。

于 2009-06-04T08:22:55.217 回答
1

任何可能已经执行的 SQL 都不会被提交。如果您的回滚由于某种原因超时不会导致提交。因此,最终数据库将意识到它已经完全消失了,并将丢弃这些更改。

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

如果有回滚,那么最后几位不会被调整,并且那些分配的页面只是成为空闲页面以用于其他事情。您不能指望数据库再次缩小。

于 2009-06-04T08:18:56.923 回答
0

分页可以在回滚中存活:

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

于 2009-06-04T16:13:17.120 回答
0

一旦回滚开始,它必须完成。无论您是否仍然连接,SQL Server 仍然会完成回滚。未能完成回滚会使您的数据库事务性损坏并需要恢复。

于 2009-06-04T16:23:25.387 回答