トランザクションが「コミット」されている場合、確実に保存されますか?


12

トランザクションが正常にコミットされた場合、データベースとログファイルに書き込まれたことを100%確認できますか?データが保存されていることを確認できますか?

今日、ログファイルはドライブの制限に達し、多くのエラーが発生しました。さらに、他のいくつかのサービスがクラッシュしました。ディスクを増やし、サーバーを再起動しました。

起動時に、サーバーは「データベースの回復」を行いました。すべてが再び正常に動作することを確認できますか?


2
リカバリの完了後にエラーログをチェックして、コミットされたトランザクションの数とロールバックされたトランザクションの数を確認できます。これに対する魔法の答えはありません。ディスクがクラッシュした場合、その時点でのトランザクションの状態にすべて依存します。
アーロンバートランド

1
@AaronBertrandしかし、トランザクションが「コミット」状態にある(つまり、コミットが成功した)場合、回復中に失われたままになる可能性はありますか?
SQLポリス

3
@Giosco:できません。「コミット」とは、データベースのログファイルにあることを意味します。それを失う唯一の方法は、1)データファイルに保存される前にログファイルを失うか、2)ログファイルとデータファイルの両方を失うか、3)人的エラーのいずれかです。通常、(3)が最も可能性が高いことに注意してください。
–RBarryYoung

2
@Gioscoは、フルドライブの時点でのすべてのトランザクションが正常にコミットされたことをどのように知っていますか?
アーロンバートランド

2
ストアドプロシージャ<>トランザクション-ストアドプロシージャに複数の明示的なトランザクションを含めることができます。または暗黙的にのみ、try / catchロジック、C#レイヤーでのトランザクション処理などを行うことができます。全面的な声明としては少し危険すぎるかもしれません。
アーロンバートランド

回答:


16

クライアントアプリケーションがCOMMITを発行して成功コードを返した場合、トランザクションはエンジンによって永続性が保証されます。クラッシュ後であっても、トランザクションで行われたすべての変更が表示されることが保証されています。さらに、リカバリは、クラッシュした場合にコミットされていないトランザクションがロールバックされることも保証します。

詳細については、ARIESの論文を読むことをお勧めします。

基礎となるストレージハードウェアに障害(破損)がある場合、先行書き込みログと回復は保証できません。また、エンジニアリング製品には欠陥が含まれる場合があります。

アプリケーションは、他のすべてのアプリケーションと同様に、クラッシュ(エラー)が発生した場合に正しく動作するように慎重に記述する必要があります。魔法はありません。


クライアントアプリケーションがCOMMITを発行したが、クライアント側のタイムアウトまでDBからの応答が受信されない場合。このコミットはどうですか?成功か失敗か?確認方法
ギャブは好人
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.