SQLは、私のロールバックタイムアウト場合は、暗黙的なロールバックを行いますか?
-
09-09-2019 - |
質問
私は
transactionaly的に文を削除、更新、挿入のセットを実行DOTNETのapplicatonを持っていますのコードは次のようである
try
{
mytrans = mycon.begintransaction();
//execute sql statements
mytrans.commit();
}
catch(Exception)
{
mytrans.rollback();
}
問題は時々我々はロールバックでタイムアウト例外に直面し、私は、データベースのサイズ(MDFファイル)が増加したことがわかったということです! だから、SQLは、暗黙的なロールバックをしないことを意味しますか?もしそうなら、私はこのエラーから回復し、元の状態???
に行くことができますか解決
取引の基本的な概念は、コミットされていないトランザクションがデータベースの状態には影響しないことを要求します。
ファイルサイズは何を意味するものではありません。彼らはログとインデックスが含まれ、そのファイルは、DB内のデータ量とは全く独立して成長し、縮小することができます。
- RDBMSのデータ構造ははるかに複雑単にファイルに行を追加するよりも。他のヒント
を実行した可能性のあるSQLは、まだコミットされていません。何らかの理由であなたのロールバックがタイムアウトした場合、それはコミットにはなりません。したがって、最終的にDBは、そのすべてがpearshapedなくなって変更を破棄します実現します。
MDFサイズの増加は、トランザクションがコミットされていることを示すものではありません。しかし、トランザクションの結果がどこかにおいておく必要があります。トランザクションのコミットは、DB内の可能な最小の変更を要求すべきです。したがって、ページが割り当てられることが、データが書き込まれ、上のすべての適切な場所を指してほんの数他のビットが微調整されてコミットます。
ロールバックがある場合は、これらの最後の数ビットは、微調整して、それらの割り当てられたページは、単に他のものに使用する空きページになっていません。あなただけ再び縮小するDBを期待することはできません。
ページのスリットは、ロールバックを生き残ることができます:
それが完了する必要があります。あなたはまだ接続されているかどうかは、SQL Serverがまだロールバックを完了します。ロールバックを完了するために失敗すると、transactionaly壊れと回復の必要性でデータベースを残します。