2009-06-04 8 views
2

私は、コードがこのロールバックのタイムアウトが発生した場合、Sqlは暗黙のロールバックを行いますか?

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

ようなもので問題は時々我々はロールバックでタイムアウト例外に直面し、私ということですtransactionaly的に文を削除

、更新、挿入のセットを実行DOTNETのapplicatonを持っていますデータベースサイズ(mdfファイル)が増加していることがわかりました。 これは、Sqlが暗黙のロールバックを行わないことを意味しますか?どうすればこのエラーから回復し、元の状態に戻ることができますか?

答えて

2

トランザクションの基本概念は、コミットされていないトランザクションはデータベースの状態に影響を与えないことを要求します。

ファイルサイズは何も意味しません。 RDBMSのデータ構造は、ファイルに行を追加するだけではなく、ログとインデックスを含んでいるため、ファイルはDB内のデータ量とはまったく無関係に拡大または縮小することができます。

+0

これは、コミットされていないトランザクションが暗黙的にロールバックされることを意味します。ロールバックメソッドの目的は何か –

+0

はい、コミットされていないトランザクションは、DB接続がクローズされたとき(場合によってはタイムアウトによって)、暗黙的にロールバックされます。ロールバックメソッドのポイントは、ロールバックが技術的な問題ではなくプログラムロジックによって引き起こされる場合があるため、プログラムがこれを制御できるようにすることです。すなわち、プログラムがトランザクションを開始し、何らかの処理を行い、ロールバックすることを決定しますトランザクションと同じDB connectioncを使用して何か代わりに行う –

+0

[OK]を私のロジックは、最初に私は現在のテーブルをhisoricalテーブルにシフトしているし、このシフト中にいくつかの処理を行う私は主キー違反の例外に直面してプログラムがロールバックしようとしたとタイムアウト例外が発生した後、特定の歴史的なテーブル!これは、SQLがロールバック(私はそうだと思う)に失敗したことを意味します –

1

実行されたSQLは、まだコミットされていません。あなたのロールバックが何らかの理由でタイムアウトした場合、コミットが発生しません。したがって、最終的にDBはすべてが梨地になったことを認識し、変更を破棄します。

MDFサイズの増加は、トランザクションがコミットされたことを示すものではありません。しかし、取引の結果はどこかに置く必要があります。トランザクションのコミットは、DB内で可能な最小の変更を必要とする必要があります。したがって、ページが割り当てられ、データが書き込まれた後、すべての適切な場所を指し示す数ビットだけがコミットされます。

ロールバックがある場合、最後の数ビットは調整されず、割り当てられたページは単に他のものに使用される空きページになります。あなたはDBがちょうど再び縮小するとは期待できません。

0

たら、それが完了する必要があります。まだ接続されているかどうかに関係なく、SQL Serverはロールバックを完了します。ロールバックを完了しないと、データベースのトランザクションが破損し、リカバリが必要になります。

関連する問題