我有一个dotnet应用程序,以事务方式执行一组插入,更新,删除语句
代码就像这样
try
{
mytrans = mycon.begintransaction();
//execute sql statements
mytrans.commit();
}
catch(Exception)
{
mytrans.rollback();
}
问题是有时我们在回滚时遇到超时异常,我发现数据库大小(mdf文件)增加了! 那么这意味着Sql不会进行隐式回滚吗?如果是这样,我怎样才能从这个错误中恢复并进入原始状态???
答案 0 :(得分:2)
事务的基本概念要求未提交的事务不会影响数据库的状态。
文件大小并不意味着什么。 RDBMS数据结构比简单地在文件中添加一行要复杂得多 - 它们包括日志和索引,因此文件可以独立于数据库中的数据量而增长和缩小。
答案 1 :(得分:1)
任何可能已执行的SQL都尚未提交。如果由于某种原因你的回滚超时不会导致提交。因此,最终数据库将实现其全部变形,并将丢弃这些变化。
MDF大小的增加并不表示交易已提交。但是,交易的结果需要放在某处。提交事务应该要求DB中尽可能小的更改。因此,可以分配页面并写入数据,然后在提交时调整指向所有正确位置的其他几个位。
如果有回滚,那么最后几位不会被调整,那些分配的页面只会成为用于其他事情的空闲页面。你不能指望数据库再次缩小。
答案 2 :(得分:0)
页面切口可以在回滚中存活:
答案 3 :(得分:0)
一旦Rollback开始,它必须完成。无论您是否仍在连接,SQL Server仍将完成回滚。如果未能完成回滚,则会导致数据库事务损坏且需要恢复。