調べた背景
普段何気なくBEGIN TRAN と COMMIT TRANを使っているけれど、人に説明できるほど理解していないと思ったため。
参考にしたドキュメントや書籍
上記文献からの引用が多いですがご了承ください。
自分の理解のために作成した図などを載せています。
トランザクションの論理アーキテクチャ
ログレコードについて
トランザクションはトランザクションログが存在することで動作可能となっています。
トランザクションログに記載されていく各動作のログのことをログレコードと呼びます。
それぞれのログレコードはLSN(Log Sequence Number)によって識別されます。
新しい各ログレコードは、ログの論理上の末尾に前のレコードのLSNよりも大きなLSNをつけて、作成された順に連続して書き込まれます。
LSN2によって参照されるログレコードで示される変更は、LSN1で示される変更の後に行われます。
各ログレコードにはトランザクションIDが含まれており、どのトランザクションに含まれているレコードかが示されています。
各トランザクションに関連付けられているログレコードはすべて、逆方向のポインターを使用して連鎖的にリンクしており、
これによってトランザクションのロールバックを早くすることができます。
データ変更のログレコードには、実行した論理操作の記録または変更したデータの前後のイメージの記録が行われます。 前イメージは操作が実行される前のデータのコピーのことで、後イメージは操作を実行した後のデータのコピーです。
操作の復旧手順
-
論理操作が記録されている場合
- 論理操作をロールフォワードするには、その操作を再実行します。
- 論理操作をロールバックするには、逆の論理操作を実行します。
-
前後イメージが記録されている場合
- 操作をロールフォワードするには、後イメージを適用します。
- 操作をロールバックするには、前イメージを適用します。
自分なりに調べてみたのですが、残念ながら論理操作の定義はわかりませんでした。
ログレコードの種類
以下のクエリで現在使用中のデータベースのトランザクションログファイルの中身を見ることができます。
select * from sys.fn_dblog(null,null);
画像に表示されているものは取得できるカラムの一部です。
引用元のサイトに特に有用な情報として紹介されていました。
画像ないにはありませんが、もちろんロールバックした際のレコードも生成されます。
画像引用元:Inside the Transaction Log file using fn_dblog() and fn_full_dblog()
障害発生時などのロールバックに必要なLSN
障害発生時などで、トランザクションがコミットされずに終了してしまった場合などで
データベースに対しロールバックをする際に必要となるLSNが存在します。
ロールバックを成功させるために必要となるログレコードのログファイルセクションは
ログのアクティブな部分と呼ばれ、その最初のログレコードのLSNを
最小復旧LSNと呼ばれています。
物理アーキテクチャを理解する際、この最小復旧LSNは重要なものとなっているようです。
まとめ
SQL Serverのトランザクションでは、各動作をLSNという値で判別し、
ログファイル内に該当の動作の情報を保存しているようでした。
また、最小復旧LSNが存在していることによってロールバック時に
どのトランザクションの内容からデータを復旧させるかを判断しているようです。
トランザクションログファイルの内容は
処理の順に時系列に並んでいて、シーケンシャルな構造になっていると言えると思います。
内容について不備やご意見などあればコメントお願いいたします。
ここまで読んでいただいてありがとうございました。