10-データベース

データベース(Part.9)| 保全機能・排他制御・障害復旧 | 現役エンジニア&プログラミングスクール講師

目標

「DBMSの仕組み」について概要を復習する
「保全機能(トランザクション・ACID特性)」について概要を理解する
「排他制御」について概要を理解する
「障害復旧」について概要を理解する

DBMSの仕組み

DBMSの機能(再掲載)

データベースマネジメントシステムには次のような主な機能がありました。

①「データベース言語の提供」
データベースの定義・操作・制御などを行う言語を利用できる

②「効率的なデータアクセス機構」(前回の記事で扱いました)
データの効率的な格納方法の提供・インデックス設定による検索処理の効率化・問い合わせ最適化機能の提供

③「保全機能(整合性の維持)」(この記事で扱います)
データの整合性を保証するための機能

④「機密保護」
ユーザーへのアクセス権限の付与を提供し不正アクセスを防止する機能

⑤「排他制御(同時実行の制御)」(この記事で扱います)
複数の処理を同時に行ったときに矛盾が起きないようにする機能

⑥「障害復旧」(この記事で扱います)
システムの障害やトラブルに対してデータベースを復旧する機能

これらの機能を少しずつ見ていきたいと思います。
(データベース言語の提供については実際の操作で確認)

保全機能(整合性の維持)

トランザクション

データベースに対する処理には「複数の処理でひとつの処理」とするものがあります。この「それ以上分けることができない最小の処理単位」のことを「トランザクション」といいます。

例:銀行での振り込み操作(AさんがBさんへ5万円を振り込む)では次の二つの処理がトランザクションの単位となります。

1.Aさんの口座残高から5万円減らす
2.Bさんの口座残高を5万円増やす


正常に2つの処理が行われた場合は操作前と操作後の残高の合計は同じとなります。
振り込み前:1,000,000+1,000,000=2,000,000
振り込み後: 950,000+1,050,000=2,000,000

次は株式会社ほわほわさんの送金処理が終わった後にシステムにトラブルが起こった場合となります。トラブルにはシステム自体の問題以外にも災害や停電などがあります。

正常に2つの処理が行われなかった場合は操作前と操作後の残高の合計に差が生じてしまいます。
振り込み前:1,000,000+1,000,000=2,000,000
振り込み後: 950,000+1,000,000=1,950,000

コミット処理(コミット操作)とロールバック処理(アボート操作)

トランザクション処理では上で確認した通り、一連の全ての処理が「正常に終了する場合」と「途中で中断する場合」が考えられます。トランザクション処理では、この2つの結果に対して「正常に終了した場合」は「コミット」、「途中で中断した場合」は「ロールバック」という処理をそれぞれ行うことになります。

コミット処理(commit)…コミット処理はトランザクション処理が「正常に終了した場合」にその更新を確定させる操作(コミット操作)として行います。

ロールバック処理(rollback)…ロールバック処理はトランザクション処理が「途中で中断した場合」にその操作を取り消す操作(アボート(abort)操作)として行います。

ACID特性

トランザクションには満たすべき4つの重要な特性がありこれをACID特性といいます。ACID特性は次の4つの頭文字から名前が付けられています。

  1. 原子性(Atomicity)…トランザクションは「全ての処理が完全に行われる」か、もしくは「全て行われない」ことを保障する。
  2. 一貫性(Consistency)…トランザクション処理の前後で整合性が維持される。処理前の一貫した状態から、処理後の一貫した状態に遷移する。
  3. 独立性(Isolation)…トランザクションの処理が他の処理に影響を与えない。
  4. 永続性(Durability)…完了したトランザクションの処理の結果は失われない。処理自体を取り消すことはできない。元の状態に戻す場合は、補修用のトランザクションの処理を行う。

排他制御・障害復旧

トランザクション管理

トランザクション管理は次のように分類することができます。

トランザクション管理

  1. 排他制御…スケジュール法(静的)・ロック法(動的)
  2. 障害復旧…シャドウページ法・ログ法

トランザクションに関する重要語

ステップ…トランザクションを構成するデータの読み込み(read)やデータの書き込み(write)などの個々の処理。「read(a)はデータaを読み込むという意味」

スケジュール…複数のトランザクションを実行する場合に、全てのトランザクションに関わる其々のステップがどの順番で動くかを決めたもの。

下図のread(a)やwrite(b)などが複数のレーン(トランザクション)で上から順番に並んでいるのがスケジュール

TPS(transaction per second)…システムが1秒間に処理できるトランザクション数。

直列実行…トランザクションを順番に実行する処理(下図の左)。TPSは上がらない。

並列実行…トランザクションをステップで分割して実行する処理(下図の右)。CPUはディスクの読み出し、書き出し時などは処理を止めて待ち状態になりますが、並列実行であれば、この待ち状態時に別のステップを当てることができるためTPSは向上します。

直列スケジュール…トランザクションが一つずつ順番に実行されるスケジュール。整合性が保たれます。

非直列スケジュール…複数のトランザクションが同じデータを扱う(更新する)ことがあり、一貫性がなくなる可能性があるスケジュール。

スケジュール法…複数のトランザクションを実行する時に事前に適切な順番を決めて実行する並列実行で直列化可能な非直列スケジュール。

直列化可能(直列可能スケジュール)…複数のトランザクションを直列スケジュールで実行した時と非直列スケジュールで実行した時と結果が同じになる並列実行。

ロック法…複数のトランザクションが実行されるときデータへの同時アクセスをさせない仕組み。

ロッキングプロトコル…ロック法の規約。トランザクションがデータの読み書きをする時はデータにロックをかける。トランザクションが他のトランザクションによってロックをかけられているデータを処理しようとしたときはロックをかけたトランザクションの処理が終わるのを待たなければいけない。

ロッキングプロトコルは直列可能スケジュールを保証するわけではありません。

共有ロック…読み出しの場合に利用するロックです。共有ロック同士であればロックを両立できます。

専有ロック(占有ロック)…書き込みの場合に利用するロックです。ロックを行えるトランザクションは必ず1つとなります。ロックの両立はできません。

ロックの両立可能性共有ロック専有ロック
共有ロック
専有ロック

共有ロック同士であれば読み出しのロックを両立できます。またSELECT文の利用が可能です。それ以外の組み合わせはロックの解放待ちとなります。

2相ロッキングプロトコル(2PL(two phase locking protocol))…直列可能スケジュールを保証するロッキングプロトコルです。

2相ロック…トランザクションがトランザクション内のロックすべきデータを全てロックするまでは、例え、書き込みが完了したデータであってもロックを解かない。全ての必要なデータのロックが完了していれば順次、ロックを解除します。

等価…直列化可能かを判断するための定義

等価については先行グラフを利用してループが無いことを確認する。

ビュー等価…それぞれのトランザクションで読み込むデータが同じ(扱うデータが同じトランザクションの結果を利用している)で、最終的なデータベースの状態も同じであれば等価

競合等価…それぞれのトランザクションのデータへのアクセス順序が同じであれば等価(競合等価であればビュー等価であるが逆は成り立たない)

デッドロック…あるトランザクションがかけたロックと別のトランザクションがかけたロックがお互いに解除待ちの関係にある相互のロック状態。硬直状態のこと。デットロックの回避には「検知」・「防止」・「回避」があります。

検知…デットロックのトランザクションを検知して終了する。
防止…デットロックが発生しないように制御する。
回避…デットロックが起きたときに硬直状態にならないように処理する。

デットロックの対処としては「回避」が利用されます。その処理方法として「ウエイト・ダイ方式」と「ワウンド・ウエイト方式」があります。

ウェイト・ダイ方式…トランザクションが別のトランザクションよりも早くロックを開始した場合は解除待ちのロックについては順番を待ちます。逆に別のトランザクションよりも遅くロックを開始した場合は即時アボードします。

ワウンド・ウェイト方式…トランザクションが別のトランザクションよりも早くロックを開始した場合は別のトランザクションをアボードさせます。

トランザクションの障害

障害の種類
  1. トランザクション障害…参照するデータがないなど。
  2. システム障害…停電やハードウェアなどの問題。
  3. メディア障害…ハードディスクなどの記憶媒の損傷など。
障害への対応
  1. トランザクション障害…トランザクションをアボード(ロールバック)する。
  2. システム障害…システムを再起動してトランザクションを最初からやり直す(ロールバック)。必要によってはロールバックとロールフォワードを行う。
  3. メディア障害…バックアップやログを利用して復旧を行う。

トランザクションの処理はデータファイルへ直接行うのではなく、主記憶(キャッシュもしくはメモリなどCPUから近い位置にある一時記憶のスペース)で行っています。メディア障害は主記憶とデータファイルの状況が異なるトラブルで、これにはログを利用して復旧します。

ロールフォワード…ログからの書き出しにはチェックポイント(時間)が登録されます。ロールバックは障害発生時にトランザクションの開始前まで戻るのに対して、ロールフォワードは障害発生時にチェックポイントまで戻り、チェックポイント以降の処理で完結しているのであれば、そこまで処理を進めてくれます。

ログ法…ログを使用して障害復旧する方法
シャドウページ法…ログでなく障害前後のページを利用して障害復旧する方法

バックアップの種類

  1. 完全バックアップ…全データに対してバックアップ処理を行う方法
  2. 差分バックアップ…ひとつ前の完全バックアップとの差分のみをバックアップする方法
  3. 増分バックアップ…ひとつ前の完全バックアップ、もしくは完全バックアップ+増分バックアップとの差分をバックアップする方法

耐障害性の手法

ディスクに対してはRAID0(ストライピング)、RAID1(ミラーリング)、RAID5(分散パリティ)、非常用電源についてはUPSなどがあります。

今回は以上になります。

「データベース」おすすめ書籍6選【初心者用3冊&実践用3冊】| 現役エンジニア&プログラミングスクール講師「データベース」初心者の方がデータベースを基本からしっかりと理解するためのお勧めの書籍について取り上げています。また中級者の方が更に進んだ学習ができる実践的な書籍についてお勧めできる3冊を取り上げています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】| 現役エンジニア&プログラミングスクール講師「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST
10-データベース

データベース(Part.11)| MariaDB SQLと表の種類&SQLコマンド例 | 現役エンジニア&プログラミングスクール講師

2023年4月13日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
10-データベース

データベース(Part.8)| DBMSの仕組みと効率的なデータアクセス機構 | 現役エンジニア&プログラミングスクール講師

2023年4月7日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
10-データベース

データベース(Part.1)| データベースの概要 | 現役エンジニア&プログラミングスクール講師

2023年3月29日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
10-データベース

データベース(Part.2)| 3層スキーマの概要 | 現役エンジニア&プログラミングスクール講師

2023年3月31日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
10-データベース

「データベース」おすすめ書籍6選【初心者用3冊&実践用3冊】| 現役エンジニア&プログラミングスクール講師

2024年5月15日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
10-データベース

データベース(Part.7)| リレーショナル代数 | 現役エンジニア&プログラミングスクール講師

2023年4月6日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site