トランザクション
データ参照時に(つまりselect文実行時に)FOR UPDATE句を指定すると、対象行に専有ロックを掛け、トランザクション終了時に解放する。
[トリガ]
障害回復機能
ロールバック(UNDO)…更新前ログを利用することによって、ハードディスクのデータをトランザクションの実行前に戻す。
ロールフォワード(REDO)…更新後ログを利用することによって、ハードディスクのデータをコミット完了後の状態に進める。
WAL(ログ先行書き込み)
1.DBは更新内容を直接データファイルに書かない
2.まずログ(REDO/UNDO/WAL)に書き込む
3.ログがディスクにフラッシュされた時点で「コミット完了」とみなす
4.障害復旧時にはログを元にロールフォワード(REDO)/ロールバック(UNDO)する
分散データベース
[分散問合せ処理]
入れ子ループ法…データを1行ずつ送信。基本的にRDBMS系はこれ。
マージ結合法(ソートマージ法)…ソートした後にデータの全行を一度に送信。
セミジョイン法…EXISTS か IN を使って、存在確認だけで結合を済ませるやり方。結果処理はサイトごと。
[2相コミット(2PC, Two-Phase Commit)]
2相コミットを行うためには,同時に更新しようとする分散データベースの全てが更新可能かどうかを判断するためのやり取りが必要である。
主サイトは,コミットが可能であることを各データベースサイトに確認した後,コミットを発行する。2というのはノードの数ではない。100ノードあっても2PC。
ロールバック
例: ユーザーが UPDATE をしたけど途中でエラー → そのトランザクションをなかったことに戻す。
例: バッチ処理の途中で例外発生 → その伝票分だけ全部取り消し。
ロールフォワード
例: サーバがクラッシュしてDBが落ちた。
再起動時にログを読んで「最後のコミット状態」までDBを追いつかせる。
これは ユーザーの意識と関係なくDBが自動でやる。
2相コミット(2PC)
例: 本社のOracle DBと、支店のSQL Server DBの両方に伝票を入れなければならない。
「両方成功ならコミット/片方失敗なら両方ロールバック」を保証する仕組み。
これもアプリが COMMIT; を出すと裏で勝手に動く。