1 トランザクション管理

Similar documents
Microsoft Word - Manage_Add-ons

Chapter Two

Microsoft Word - Circular-Memory-Leak_Mitigation

Chapter Two

A Dynamic Mobility Histogram Construction Method Based on Markov Chains

Microsoft Word - Per-Site_ActiveX_Controls

著作権 このドキュメントに記載されている情報は このドキュメントの発行時点におけるマクロソフトの見解を反映したものです マクロソフトは市場の変化に対応する必要があるため このドキュメントの内容に関する責任を問われないものとします また 発行日以降に発表される情報の正確性を保証できません このホワトペ

DUCTION はじめての人のための トランザクション入門 TO INTRO- TRANS- 日本 PostgreSQL ユーザ会第 35 回 PostgreSQL 勉強会 2017 年 5 月 27 日 ACTION 坂田哲夫 (NTT OSS センタ ) 1

プレポスト【問題】

リレーショナルデータベース入門 SRA OSS, Inc. 日本支社 Copyright 2008 SRA OSS, Inc. Japan All rights reserved. 1

Visual Studio Do-It-Yourself シリーズ 第 11 回テーマとスキン

Microsoft Word - Improved_Protected-Mode_API_Support

Office 365監査ログ連携機能アクティブ化手順書

HANDyTRUSt「携帯電話操作編《(DOCOMO 900シーズ)

Citrix Receiver導入の手引き

Microsoft Word - W3C's_ARIA_Support

ホームページ・ビルダー サービス「ライトプラン」

データベース 【1:データベースシステムとは】

Microsoft Word - Outlook 2003 Senario.doc

Polycom RealConnect for Microsoft Office 365

PowerPoint プレゼンテーション

7-1- 基 RDB に関する基礎知識 1 独立行政法人情報処理推進機構

ホームページ・ビルダー サービス「ライトプラン」

著作権 このドキュメントに記載されている情報 URL 等のインターネット Web サイトに関する情報を含む は 将来予告なしに変 更することがあります 別途記載されていない場合 このソフトウェアおよび関連するドキュメントで使用している会社 組 織 製品 ドメイン名 電子メール アドレス ロゴ 人物

ホームページ・ビルダー サービス「ライトプラン」

PowerPoint プレゼンテーション

著作権 このドキュメントに記載されている情報 (URL 等のインターネット Web サイトに関する情報を含む ) は 将来予告なしに変 更することがあります 別途記載されていない場合 このソフトウェアおよび関連するドキュメントで使用している会社 組 織 製品 ドメイン名 電子メールアドレス ロゴ 人

OpenLAB Data Store Release Notes

はじめに コース概要と目的 Oracle を使用した開発 管理を行う上でのファースト ステップとして リレーショナル データベース管理ソフトウェアである Oracle の役割 基本機能 基本アーキテクチャを幅広く理解することを目的としています 受講対象者 これから Oracle を使用する方 データ

Microsoft認定資格問題集DEMO(70-459_Part2)

VBAのライセンス登録ガイド

Oracle Enterprise Linux 5における認証

Microsoft PowerPoint - CloudBasic-6-cloudservices2.pptx

AN424 Modbus/TCP クイックスタートガイド CIE-H14

CR-UK1ソフトウェアユーザーズガイド

2 マイクロソフトサーバー製品のログ監査ガイド 注意事項 : マイクロソフト ( 米国 Microsoft Corporation 及び同社が直接または間接に所有する法人を含みます 以下同じ ) は 本書の内容及び本書を使用した結果について明示的にも黙示的にも一切の保証を行いません また マイクロソ

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

マニュアル訂正連絡票

2007 Microsoft Corporation. All rights reserved. 本書に記載した情報は 本書各項目に関する発行日現在の Microsoft の見解を表明するものです Microsoft は絶えず変化する市場に対応しなければならないため ここに記載した情報に対していかな

MAC アドレス変更ツール MAC アドレスチェンジャー ユーザーズマニュアル User's Manual エレコム株式会社

Microsoft Word - Outlook Web Access _IE7_ Scenario.doc

導入設定ガイド

BraindumpsVCE Best vce braindumps-exam vce pdf free download

Visual Studio 2017 RC インストール & ファーストステップガイド 2016 年 11 月 16 日 (V1.0)

SQL Server 2012 自習書シリーズ No.16 ロックと読み取り一貫性 Published: 2008 年 5 月 31 日 SQL Server 2012 更新版 : 2012 年 9 月 30 日有限会社エスキューエル クオリティ

Project Professional 2013 プレビュー

LTE モバイルルータ ソフトウェア更新手順 第 2 版 2017 年 9 月 富士通株式会社

スライド 1

V-CUBE One

03_共有フォルダ

Visio-XPSP2_fl—fl….vsd

ファクス送信用変換ソフト 操作説明書_UA

Oracle Web CacheによるOracle WebCenter Spacesパフォーマンスの向上

Microsoft PowerPoint - OS04.pptx

目次 Discoveries InSite について InSite ポータルの特徴と搭載される機能 社内ポータルサイトを作成する InSite にサインインする 社内ポータルサイトを作成する 社内ポータルサイトを変更す

地図 SD カードを取り外す 最初に ナビゲーション本体から地図 SD カードを取り外します 本操作は地図 SD カードを初めて ROAD EXPLORER Updater に登録するときや パソコンにダウンロードしたデータを地図 SD カードに保存するときに実行してください 1 ナビゲーション本体

QNAP vsphere Client 用プラグイン : ユーザーガイド 2012 年 12 月更新 QNAP Systems, Inc. All Rights Reserved. 1

PowerPoint プレゼンテーション

目次 1 章はじめに 本書の利用について Web ブラウザーについて 章 kintone でタイムスタンプに対応したアプリを作成する kintone にログインする kintone でアプリを作成する

2 組織アカウントを作成する 組織アカウントについて Office 365 などの Microsoft のオンラインサービスを使用するには 組織の管理者およびユーザーは 組織アカウントを使用して サービスにサインインする必要があります 新しいオンラインサービスのアクティブ化を行う際 組織アカウントを

障害管理テンプレート仕様書

Microsoft Partner Network Yammer モバイル利用ガイド 2015 年 8 月

PowerPoint プレゼンテーション

免責事項 Samsung Electronics は 製品 情報 および仕様を予告なく変更する権利を留保します 本書に記載されている製品および仕様は 参照のみを目的としています 本書に記載されているすべての情報は 現状有姿 のまま 何らの保証もない条件で提供されます 本書および本書に記載されているす

SQL Server 2008 自習書シリーズ No.14 ロックと読み取り一貫性 Published: 2008 年 5 月 31 日 改訂版 : 2008 年 10 月 27 日 有限会社エスキューエル クオリテゖ

Microsoft Word - Data_URI_Support

Microsoft Word - User-Agent_String_and_Version_Vector

アーカイブ機能インストールマニュアル

本書はクラウド型 Dynamics CRM Online に基づいておりますが 設置型の Dynamics CRM 2013 についてもほぼすべての内容が適用できます 本書は 2013 年 10 月執筆時点での Dynamics CRM Online 製品リリース版に基づ いており 機能強化などによ

プラン作成ガイド ~ 仮想環境をエージェントレスで バックアップするプランの作成 ~ 年 8 月

Windows Server 2012/2012 R2 Active Directory環境へのドメイン移行の考え方

データセンターの効率的な資源活用のためのデータ収集・照会システムの設計

Solar Link ARCH ソーラーリンクアーク Step 1 ログインと ID パスワードの変更 施工の際 一括監視画面に計測値が正常に表示されるかを施工ご担当者様にて確認する必要があります そのため まずは 設定メニュー画面 にログインして頂き 施工ご担当者様へ開示可能な ID パスワードに

ボリュームライセンスのアップグレードライセンス : Windows アップグレードライセンスは ライセンスが最初に割り当てられたデバイスでのみ使用できるため 再割り当てを行うことはできません ただし ボリュームライセンスでは 適切なライセンスを取得した交換用のデバイスにソフトウェアアシュアランスを再

LTE WiFi USBドングル ソフトウェアの更新手順

第 7 章 ユーザー データ用表領域の管理 この章では 表や索引を格納するユーザー データ用表領域の作成や 作成後のメンテナンスに ついて解説します 1. ユーザー データ用表領域の管理概要 2. ユーザー データ用表領域作成時の考慮事項 3. ユーザー データ用表領域の作成 4. ユーザー データ

Oracle Cloud Adapter for Oracle RightNow Cloud Service

データ移行ツール ユーザーガイド Data Migration Tool User Guide SK kynix Inc Rev 1.01

BACREX-R クライアント利用者用ドキュメント

捺印ツールを使う 捺印ツールをインストールする 1. [ パソコン決裁 6 試用版捺印ツール ] の [ ダウンロード ] ボタンをクリックします 2. [ 実行 ] ボタンをクリックし [SetupDstmp32.exe] ファイルを実行します ご利用のブラウザまたはバージョンにより画面が異なりま

ユーザーズサイトのオフライン ウイルス定義データベースを利用したオフライン更新手順書(バージョン 5 以前向け)

RDX へのバックアップ 3 ベアメタル復旧手順書 2014 年 11 月

Arcserve Replication/High Availability 製品の仕組み

brick アクセス解析レポート マニュアル

橡ExCtrlPDF.PDF

Microsoft Word - Outlook 2007 Senario.doc

改訂履歴 日付バージョン記載ページ改訂内容 V2.1 - 初版を発行しました V3.1 P5 ドキュメントラベルが新規追加された事を追記 P7 P8 新しくなったラベルのツリー表示説明を追記 新しくなったラベルの作成 削除操作を追記 P9 ラベルのグループ

KDDI ビジネスメール 一般ユーザ用カスタマーコントロール操作ガイド Ver.2.04 Copyright , KDDI Corporation All rights reserved 1

管理者マニュアル

9 WEB監視

OmniTrust

変更履歴 項番版数内容更新日 版新規作成 2013 年 11 月 18 日 1

今さら聞けない!? Oracle入門 ~後編~

Autodesk Inventor Skill Builders Autodesk Inventor 2010 構造解析の精度改良 メッシュリファインメントによる収束計算 予想作業時間:15 分 対象のバージョン:Inventor 2010 もしくはそれ以降のバージョン シミュレーションを設定する際

1 はじめに 概要 特徴 動作環境 本マニュアルの見かた 用語集 プロファイルについて 制約事項 ライセンス認証 ( プロファイルのインストール ) を行う..

iStorage NSシリーズ 管理者ガイド

パソコン決裁7 捺印ツールインストールマニュアル

InfiniDB最小推奨仕様ガイド

目 次 1. はじめに アルコールチェッカー管理ソフトのインストール アルコールチェッカー管理ソフトのアンインストール アルコールチェッカー管理ソフトの操作方法 ソフトの起動 NG 判定値の設定

目次 1. はじめに システム構成 システム構成 台構成での運用 マルチサーバ構成での運用 環境の電源管理システム構成例 ESMPRO/UM を使用する構成例 (100 シリーズサーバ単体運用

Transcription:

1 トランザクション管理

このドキュメントに記載されている情報 (URL 等のンターネット Web サトに関する情報を含む ) は 将来予告なしに変更することがあります このドキュメントに記載された内容は情報提供のみを目的としており 明示または黙示に関わらず これらの情報についてマクロソフトはいかなる責任も負わないものとします お客様が本製品を運用した結果の影響については お客様が負うものとします お客様ご自身の責任において 適用されるすべての著作権関連法規に従ったご使用を願います このドキュメントのいかなる部分も 米国 Microsoft Corporation の書面による許諾を受けることなく その目的を問わず どのような形態であっても 複製または譲渡することは禁じられています ここでいう形態とは 複写や記録など 電子的な または物理的なすべての手段を含みます マクロソフトは このドキュメントに記載されている内容に関し 特許 特許申請 商標 著作権 またはその他の無体財産権を有する場合があります 別途マクロソフトのラセンス契約上に明示の規定のない限り このドキュメントはこれらの特許 商標 著作権 またはその他の無体財産権に関する権利をお客様に許諾するものではありません 別途記載されていない場合 このソフトウェゕおよび関連するドキュメントで使用している会社 組織 製品 ドメン名 電子メールゕドレス ロゴ 人物 出来事などの名称は架空のものです 実在する会社名 組織名 商品名 個人名などとは一切関係ありません 2010 Microsoft Corporation. All rights reserved. Microsoft SQL Server は 米国 Microsoft Corporation の米国およびその他の国における登録商標または商標です 記載されている会社名 製品名には 各社の商標のものもあります 1

目次 トランザクション管理...3 トランザクションとは...3 トランザクションの開始と終了...4 トランザクションの ACID 特性...5 トランザクションの直列化可能性...6 同時実行制御...7 ロック制御...7 時刻印制御 timestamp control...7 楽観的制御 optimistic control...7 ロックの種類...8 ロックの粒度...8 多粒度ロック手法と意図的ロック...9 SQL のロック...9 ロック状況の確認... 10 ロックのタ ムゕウト... 11 デッドロック... 12 デッドロックの検出と回復... 12 デッドロックの防止... 12 デッドロックを制御するための 2 つの制御方式... 13 アイソレーション (隔離) レベル... 14 ゕ ソレーションを規定する直列化可能性を破る現象... 15 ゕ ソレーション レベルの割り当ての選択基準... 15 分離レベルの変更... 24 隔離レベルと発生する現象のまとめ... 24 2

トランザクション管理 トランザクションとは? DBMS の持つ基本的な管理機能としてトランザクション管理があります トランザクションとは 多数の利用者が同時にデータベースにゕクセスしてもデータ不正などの矛盾をおこさない仕組みであり クラゕントゕプリケーションなどユーザーからのデータベースに要求する 1 回の処理単位で 複数のデータベース操作 (SQL 文 ) から成り立ちます 複数のデータベース操作 (SQL 文 ) から構成されるものの 分割できない処理の単位ということから logical unit of work とも表現されます 例えば 処理負荷は軽いが短時間で膨大な処理件数を処理することを要求される OLTP システムでは トランザクション処理が途中で中断してもデータベースの整合性をとる必要があるなど高い信頼性が要求されます データの整合性と密接な関係のある トランザクション管理 は それと相互に関連するいくつかの特性を持ちます トランザクションを理解するために 売上伝票を入力するシステムをモデルに説明します 想定業務 売上を入力する前に在庫確認をする 在庫があれば売上伝票登録をする 売上を累計する 在庫引当の予約をする 実際の業務ではこのようにいくつかの処理がセットで進められます 各処理はデータベースの操作に相当し 例えば 在庫の確認 = 在庫テーブルの検索 売上伝票の登録 = 売上明細テーブルの更新 売上の累計 = 売り上げ集計テーブルの更新 在庫引当の予約 = 在庫テーブルの更新 とします このように複数のテーブルに対して 検索や更新といった操作が 1 つの単位として行われます この一連の処理が完了してはじめて 1 つの業務が完了したとことになります これをトランザクションと呼びます 3

このトランザクションは通常であれば問題もなく完了できます ではここで 入庫情報をデータベースに書 き込んだ直後に何らかの障害が発生し以降の処理が継続できなくなったケースを考えます このケースではデータ上は入庫完了であるものの 出庫情報が書き込まれていないため 実際の在庫数と異 なる在庫数がデータベースに反映され 大きな問題が生じます つまりトランザクションが途中で異常終了 した場合は途中まで行われた処理をいったん最初まで戻してその処理をなかったことにする必要があります 何らかの異常が発生しトランザクションが失敗した際には 再度入出庫処理を行えばよい状態になり デー タに矛盾が発生しません このようにトランザクション開始以前の状態に戻すことをロールバック処理 ト ランザクション終了時に正しいデータとしてデータベースに反映させることをコミット処理といいます トランザクションの開始と終了 プログラムから初めてデータベースに接続したときや 接続中であれば何かしらの SQL 文が指定された時 にトランザクションが開始された状態となります SQL99 から 明示的な開始文として START TRANSACTION 文 が設けられましたが それ以前の標準 SQL では明示的なトランザクションの開始文は ありませんでした その後 SQL-92 から SET TRANSACTION 文 によりトランザクションの特性を指 定できるように拡張されました なお トランザクションの終了は COMMIT 文 か ROLLBACK 文 で 明示的に指定します 一連の SQL 文が正しく処理された場合には COMMIT 文 によりそれまでの SQL 文での更新内容を実際のデータベースに反映することができます また SQL 文が正しく処理されなかった 場合には ROLLBACK 文によりそれまでの SQL 文での更新内容を無効にすることができ トランザクシ ョン開始時点のデータベースの状態に戻すことができます Microsoft SQL Server では 以下の 2 つをトランザクションとして扱います 1.データ更新系のステートメント (UPDATE INSERT DELETE) 2.トランザクション定義で囲まれた複数のステートメント (BEGIN TRANSACTION COMMIT TRANSACTION) SQL Server では データ更新系ステートメント単体でトランザクションとして扱います その処理途中で 障害が発生しても UPDATE ステートメントそのものを失敗とすることができます 加えて BEGIN TRANSACTION COMMIT TRANSACTION で挟まれた複数のステートメントもトランザクションとし て扱います また SQL Server のように BEGIN TRANSACTION ステートメントを使用して明示的に開始を宣言する トランザクションは 明示的トランザクション Oracle や DB2 のように 自動的にトランザクションが 開始されるトランザクションは 暗黙的トランザクション と呼ばれます SQL Server では 次のステートメントで実行することで暗黙的トランザクションを開始することができま す SET IMPLICIT_TRANSACTIONS ON 4

SET IMPLICIT_TRANSACTIONS が ON の場合は 接続は暗黙のトランザクションモードに設定されま す OFF の場合 接続は自動コミットトランザクションモードに戻ります トランザクションの ACID 特性 保障された処理の単位 としてのトランザクション処理の内容を具体的に示すと 以下のような ACID 特性と呼ばれる制約を満たす処理の単位であるということになります 不可分なひと固まりの処理単位であるトランザクションは以下の 4 つの特性を備えていることが必要です それぞれの頭文字をとり ACID 特性 といいます 原子性:Atomicity 原子性とは トランザクションとしてまとめられた一連の処理は すべてが正常に実行されるか またはまったく実行されないかのいずれかである というものです 分割できない ( 不可分な ) 処理の単位であること 処理終了後の状態は完全に処理が完了した状態 (COMMIT 状態 ) か あるいは処理を行う前の状態のいずれかであることになります この原子性を実現するには なんらかの原因でトランザクションが失敗した場合であってもそのトランザクションによる処理途中のデータ更新を取り消す仕組み (ROLLBACK) が必要となります また この原子性が保障されることでトランザクションが成功した場合は すべての処理が正常終了したものと判断できたり 失敗した場合はすべての処理が実行されていない という具合に ゕプリケーション開発でのトランザクション管理の制御を簡便化することができます 一貫性:Consistency トランザクション実行前の時点で データベースがデータの整合性を維持している状態であれば トランザクションの実行後もデータの整合性 (*1) を維持し続ける という特性です 処理内容は処理の順序 終了状態に関係なく保障されることを意味します (*1) データの整合性 : 各データの値やデータの値同市の関係がシステム要件から見て整合性を保っている状態 独立性:Isolation 同時に実行されたトランザクション同士が相互に干渉しない 隔離された状態であることを意味します 他の処理から独立していること 同時処理したときと逐次処理したとの結果が同じであること 処理途中のデータが他の処理から見えない ( 干渉されない ) ことを意味します 耐久性:Durability コミットされたトランザクションが適切に保護され失われることがない という特性です 万一 データベースに障害が発生した場合でも コミットされたトランザクションにより実行された更新は障害復旧後も適切に維持されます また障害発生時点で未コミットの更新は取り消されます 更新途中のデータが中途半端に残ることはありません 5

トランザクションの直列化可能性複数のトランザクションが直列に処理することで データベースの一貫性を崩すことはありません そのようなスケジュールを直列スケジュールといいます ( スケジュールとは 個々のトランザクションの読み込み 書き込みの操作の順序を保ちながら 相互の操作順序を変えること ) 一方 多くののトランザクションを同時並行実行させて CPU などの資源を有効に利用することが一般的です そのため 複数のトランザクションが実行される場合 それらのトランザクションが並行動作すると同一データを参照 / 更新するなど 互いに干渉する事象が発生します 並行動作しているトランザクションが直列に動作した結果と同じ結果を得られること つまりデータベース の一貫性が保たれるようなトランザクションのスケジュールを直列可能 (SERIALIZABLE) である といい ます 6

同時実行制御 データベースに対する読み書きをおこなうトランザクションが同時に複数個動作した場合 その処理を矛盾なく実行するためのメカニズムが同時実行制御です 複数のプロセスが並行処理を行い 同じデータを更新しても異常が生じないように制御ことでトランザクション処理の 独立性 一貫性 を確保する 具体的には データベース側にゕクセス排他制御 ( 他のトランザクションのゕクセスを排除する制御 ) を設けることで 他のプロセスの影響を排除し データ不正を防止することができます 同時実行制御には ロック制御 時刻印制御 楽観的制御の大きく 3 つあります その中でも一番実用的で頻繁に使用されるのがロック制御です ロック制御同時実効制御のメカニズムで一番よくつかわれるのが ロック制御です ロックとは 文字通りデータベースに対して他のトランザクションからゕクセスできないように カギをかけるメージです ロックをかけた方のトランザクションはそのまま処理を続けますが ロックをかけられなかったトランザクションは他のトランザクションによりロックが解放されるまで待ち状態になります これに対してゕンロックとは ロックによる制限や禁止を解く機能となります このロック ゕンロック機能により 複数ユーザーによる同時書き込みの問題を解消することができます なお ロックにはロックをかけたユーザー以外からも読み込みだけは許可する共有ロック (share lock) と他のユーザーからは読み書きも許さない占有ロック (exclusive lock) が存在します 多くのユーザーから頻繁に読み書きが行われるデータに対して書き込みを行う際には 通常は共有ロックをかけます 一方 集計など数値が関与するデータに対しては 書き込み途中に読み込みを禁止するなどの処置をとるのが一般的です 時刻印制御 :timestamp control 早く開始したトランザクションにデータベースゕクセス競合時に優先権を与える方式です ロック制御と時刻印制御は 常に競合が発生するという悲観的制御ともよばれます 楽観的制御 :optimistic control めったにゕクセス競合は発生しないという楽観的な前提で競合制御します具体的には 更新するデータを前もって読んでおき 更新直前に他のトランザクションが同じデータを更新していないか読んでおいたデータを比較する もし値が違っていれば 他のトランザクションが別の値で更新したことがわかります 更新競合を検出した場合は ロールバックします 時刻印制御や楽観的制御は ロック制御を使用しづらい分散システム ( 例えばレプリケーション機能 ) で採用される場合があります 7

ロックの種類 1 種類のロックでもロック制御はできますが並行性を高めるためにロックの種類を分けるのが一般的です ロックは 基本的には共有ロック 排他ロックの 2 種類に分けられます 共有ロック トランザクションがレコードを読み出すときにこのロックをかければ 他のトランザクションは 共有ロッ クはかけられますが排他ロックはかけられない ロックの保持期間は 読み取りが完了するまでとなります 排他ロック レコードを INSERT DELETE UPDATE するときにこのロックがかけられます 他のトランザクションは ロックをかけることはできません ロックの保持期間はトランザクションが完了するまでとなります 両立性マトリクス ロックの粒度ロックをかける単位には データベース単位 リレーション ( フゔル ) 単位 物理的な入出力単位であるページ ( ブロック ) あるいはレコード単位などがあります ロックをかける単位をロックの粒度といいます ロック競合発生確率を減らすには ロックの粒度は小さいほうが良いですがあまり小さすぎると多くのリソースが必要になり ロック制御のためのリソース獲得のオーバーヘッドが増えることが懸念されます 多種類の粒度を混在して使う場合は多粒度ロック手法を用います 全レコードのデータをロックするのであ れば個別にレコードロックをかけるより全データ全体をロックするほうが効果的です 逆に 1 レコードしか ゕクセスしないのに データ全体をロックするのは処理並列性を下げることになります トランザクションごとにロックの粒度を変更できる場合は 下位のノードのロックを要求した場合にすでに 上位のノードのロックがかかっているかを調べる必要があります 逆に上位のノードのロックを要求した場 合は すでに下位のノードのロックが 1 つでもかかっているのかを調べる必要があります 8

多粒度ロック手法と意図的ロック上位のロックを要求した場合 下位のロックを全部調べるのはかなり労力がかかるので より細かい粒度でロックをかける可能性を宣言する粗い粒度でのロックを意図的ロックといいます 意図的ロックでは あるレベルのノードをロックしたい場合その上位のレベルのノードをあらかじめロックします 意図的ロックには IS(INTENSION SHARE) IX(INTENSION EXCLUSIVE) SIX(SHARED INTENSION EXCLUSIVE) の 3 種類が定義され 通常の S(SHARED) X(EXCLUSIVE) と合わせて全部で 5 種類を使います その 5 種類のロックの両立性マトリクスは 下の表に示すとおりです 多粒度ロック手法の両立性マトリクス SQL のロック通常 SQL (SELECT 文 UPDATE 文 ) を使う場合 実際には DBMS がトランザクション実行の際に自動的にロックを掛けてくれます つまり SQL 文の種類に応じて ロックがかけられ COMMIT 文または ROLLBACK 文が支持された時にロックが解放されます どのような種類のロックがどれくらいの期間かけられるかは ゕソレーションレベルを設定することできまります REPEATABLE READ SERIALIZABLE では いったん確保したロックはコミットまで解放しません しかし それ以外のゕソレーションレベルでは いったん確保したロックを解放する場合があります 特に 現在の DBMS では 並行実行性能上の観点から標準 SQL と違い ゕソレーションレベルの規定値を SERIALIZABLE ではなく READ COMMITED にしている場合が多いです 9

アイソレーションレベルとロックの関係 ロック状況の確認 Management Studio を利用してロック状況を確認することができます 上記例では セッション ID:56 の SQL 文のタスク状態が SUSPENDED となっておりセッション ID: 57 によってブロックされている状態を表します また そのセッション ID:57 ( ブロックしている側 ) で発行されている SQL 文を確認するためには当該レ コードをハラト後右クリックの 詳細 メニューから確認することができます 10

SQL ステートメントで dm_tran_locks ビューを問い合わすことでもロック状況確認することができます ロックのタイムアウト ロックされたトランザクションは基本的にリソースが解放されるまで待ち続けます このロック解放を制御 する場合は 明示的に SET ステートメントを実行します SET LOCK_TIMEOUT 時間 時間はミリ秒単位で指定 例 5 秒の場合 5000 待たない 無制限 0-1 11

デッドロックデッドロックとは 2 つのトランザクションが 2 つのリソースを逆の順序で確保しようとして 互いにもうひとつのリソースを永遠に待ち続ける状態を意味します 複数のトランザクションが それぞれ相手のトランザクション上でかかっているロックを待つことによって互いにそれから先に進めなくなります ユーザー A はデータ B を読んだ後にデータ A を更新し ゕンロックしようとしている ユーザー B は データ A を読んだ後にデータベース B を更新しゕンロックしようとしている よって双方とも反永久的に 待ちの状態となってしまう デッドロックの検出と回復デッドロックの検出には デッドロックの状況を表す待ちグラフを使用します 待ちグラフにループがあれば明らかにデッドロックが発生しており ループを検出した場合はどちらかのトランザクションを失敗させることでもう一方のトランザクションがリソースを確保し処理が継続されます 失敗させたトランザクションは 再スタートさせることになります デッドロックの検出には待ちグラフを作る時間間隔をどれくらいにするかを検討する必要があります 時間間隔を短くするとデッドロックの検出のオーバーヘッドが大きくなりすぎ 時間間隔を長くするとデッドロックの検出が遅れます デッドロックの防止理論上 リソースを確保する順番を決めることでデッドロックの発生は防ぐことができますが現実にそれをすべてコントロールすることは困難です 必要なリソースはまとめて確保する という方法も可能ですが並行実行性能が上がりません 12

最も簡単にデッドロックを防止するには ロック待ち時間がある一定時間以上になった場合に待機しているトランザクションを失敗 (abort) させるタムゕウト方式を採用します 現実的には待ちグラフを作る処理も複雑なため いくつかの DBMS ではこのデッドロックの防止方法を採用しています もう一つの防止方法として トランザクションの順序づけにトランザクションの時刻印を使用する方法があります この時刻印方式では トランザクションの開始時刻をトランザクションに付与します デッドロックを制御するための 2 つの制御方式 1 つは 先に開始したトランザクションが後から開始したトランザクションが確保しているリソースをロックしようとした場合だけ待つことを許すというものです 逆の場合は 失敗 (abort) されますが 再スタートするとき前回と同じ時刻印が付与されます 再スタートしたとき古い時刻印が与えられるために優先順位が高くなります もう一つは 先に開始したトランザクションが後から開始したトランザクションが確保しているリソースをロックしようとすると サボートされます 逆の場合は待つことが許されます 13

アイソレーション ( 隔離 ) レベル 標準 SQL におけるゕソレーション ( 隔離 ) とは 互いに平衡動作中のトランザクションのデータ操作に影響を与えあう度合を意味します その指定するレベルの種類は READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE の 4 種類があります トランザクションには隔離性が求められます つまり 複数のトランザクションが同時に実行された場合でも各トランザクションが他のトランザクションに影響されないことが求められます しかし 厳密な隔離性の実現は処理パフォーマンスの低下をもたらすため すべてのトランザクションに厳密な隔離性を適用することは困難です また 同時に実行するトランザクションが別々のデータを更新することをあらかじめわかっている場合など そもそも隔離性が必要ないケースもあります このため 標準 SQL では 4 つの隔離レベルを定義して処理の内容や要件に応じて適切な隔離レベルを使い分けられるようにしています 厳密な隔離性が必要である特定の処理については 処理パフォーマンスを犠牲にして高い隔離レベルでトランザクションを実行し 厳密な隔離性が必要ない処理には 低い隔離レベルでトランザクションを実行することができます SERIALIZABLE は 並列動作中のトランザクションの実行結果が 同じトランザクションの直列実行と同じになることを保証することを意味します 標準 SQL に定義されているトランザクションの隔離レベル ゕソレーションレベル ( 隔離 ) すなわち互いのトランザクションが影響を与えあうレベルは READ COMMITED READ UNCOMMITED REPEATABLE SERIALIZABLE の順に小さくなります SERIALIZABLE 以外は 直列化可能性を破る現象との関係も考慮する必要があります トランザクションの ACID 特性で説明したとおり トランザクションには隔離性が求められます つまり 複数のトランザクションが同時に実行された場合でも 各トランザクションが他のトランザクションに影響 されないことが求められます 厳密な隔離性の実現は処理パフォーマンスに影響されないことが求められま 14

すが 現実的には ある程度の処理パフォーマンスの低下をもたらすことを認識しておく必要があります よって すべてのトランザクションに厳密な隔離性を適用することは困難であるのと また一方で 同時に実行するトランザクションが別々のデータを更新することがあらかじめ分かっている場合など そもそも隔離性が必要ない場合もあります このため 標準 SQL では 4 つの隔離レベルを定義し処理の内容や要件に応じて適切な隔離レベルを使い分けられるようにしています 厳密な隔離性が必要である特定の処理については処理パフォーマンスを犠牲にして高い隔離性が必要である特定の処理については 処理パフォーマンスを犠牲にして高い隔離レベルでトランザクションを実行し 厳密な隔離性が必要ない処理は 低い隔離レベルでトランザクションを実行できるようになっています アイソレーションを規定する直列化可能性を破る現象 ダーティーリード:Dirty Read トランザクション A がある行を更新して トランザクション B がその同じ行を読み取るとする その後トランザクション A が ROLLBACK を実行した場合 トランザクション B はコミットされていない行の内容を読むことになる ノンリピータブルリード :Non-repeatable read トランザクション A がある行を読み取り トランザクション B がその行を更新して COMMIT を実行した後 トランザクション A がその同じ行を 2 回目に読むと 前に読んだ値と違っていて 繰り返し読み込んだ値の保障がない現象 ファントム:Phantoms トランザクション A が ある探索条件を満たす行の集合を読み取り トランザクション B が同じ探索条件を満たすところに新たな行を挿入したとする トランザクション A が 同じ探索条件で読み取りを繰り返すと 前に存在しなかった行を読み込まれる現象 アイソレーションレベルの割り当ての選択基準ゕソレーションレベルは 標準 SQL では 4 つのレベル (READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE) が規定されているのはすでに説明しました どういうトランザクションにそのゕソレーションレベルを割り当てればよいのかその選択基準を次に示します 分離レベルの実装は データベース製品によって異なりますが SQL Server と Oracle DB2 のデフォルトの分離レベルは READ COMMITED となります 15

READ UNCOMMITED 未コミット読み込みは 他のトランザクションがコミットしていない更新内容を読むことができる隔離レベ ルです 標準 SQL で定義されたトランザクションの隔離レベルのなかで 最も低い隔離レベルであり 実 用性は低いためあまり利用されることはありません READ UNCOMMITED 隔離レベルで発生する 別のトランザクションにより更新されたが まだコミットさ れていないデータを読む 現象である ダーテゖーリード が発生する可能性があります READ UNCOMMITED 隔離レベルとダーティリード 実際に SQL Server で確認すると以下のようになります ( 丸数字 SQL の実行される順番) Session A Session B ①売上実績を全件表示 ②ID:4 の売上総額に+100 16 ③売上実績を insert ④売上実績の確認

Session A の 2 ステートメントで実行された未確定のデータが Session B の 4 ステートメントを実行した 際に読み取ることができ 読み取り時のロック待ちは発生しません だたし その後 Session A でロール バックされた場合などは Session B とのデータ矛盾が発生することになります ダーテゖーリード READ COMMITED コミットしたデータが読める隔離レベルです ( コミットしていないデータは読めません ) ダーテゖーリードは発生しないが 反復不能読み取り と呼ばれる現象が発生します 反復不能読み取り とは 同一のデータに対して読み取り処理を複数回実施したときに結果が変わる現象です SQL Server では デフォルトで READ COMMITED 隔離レベルでトランザクションが実行されます READ COMMITED 隔離レベルと反復不能読み取りの説明図 17

実際に SQL Server で確認すると以下のようになります ( 丸数字 :SQL の実行される順番 ) Session A Session B 1 売上実績を全件表示 2ID:4 の売上総額に +100 の update 3 売上実績を insert 4 売上実績の select 5 売上実績を insert Session A の2ステートメントで実行された処理により排他ロックがかかり Session B の3ステートメントで実行された処理は 排他ロックのかかっているデータを参照することができずに ロック待ちとなります その後 Session A でコミットされると ロックが解放されデータを読み取ることができます 注意 :READCOMMITTED レベルでは データ読み取り時にも共有ロックをかけようとすることで排他ロックにブロックされます 18

行レベルロック 行レベルロックとは テーブルの行に対して設定するロックのことです Oracle では UPDATE INSERT DELETE の対象となる行に対して自動的にロックを設定し トランザクション終了時にロックを解放します ロックが設定された行に対して他のトランザクションが変更を試みた場合 そのトランザクションはロックが解放されるまで待機させられます SQL Server では ロックエスカレーションの無効化 を設定し ロックヒントへ ROWLOCK と指定することで 行ロック を実現します ロックの目的は 変更中のデータへのゕクセスを防いでトランザクションの隔離性を高めることと 意図し ない変更の干渉を回避することです 行レベルロックによる更新の消失の回避の説明図 19

ロストアップデート ロストゕップデートとは トランザクションが正常に終了いたにもかかわらず トランザクション終了時点で更新が正常に反映されない現象です 先に実行した更新処理をあとから実行した更新処理が上書きしてしまうように見えることから 後勝ち更新 ともいいます このような現象を防ぐためにロックは必要不可欠ですが 多数のトランザクションが同時に実行された場合 ロックの競合が発生することがある点に注意が必要です ロックの競合は トランザクションの待機につながり 結果 同時実行時のパフォーマンスの低下をもたらします SQL 処理において Oracle がどのようなロックを自動的に設定するかを理解した上でトランザクションの実行時間を短くし ロックを保持する時間を最小限にする必要があります ロストアップデートの説明図 20

REPEATABLE READ コミットしたデータが読め かつ同一の問い合わせで得られるデータの内容が同じである隔離レベルです 反復不能読み取り は発生しませんが フゔントムリード という現象が発生します 反復可能読み取りとファントムリードの説明図 21

実際に SQL Server で確認すると以下のようになります ( 丸数字 :SQL の実行される順番 ) Session A 2 売上実績を insert 3コミット 4 売上実績の全件表示 Session B 1 実績の全件表示 (1 回目 ) 5 売上実績の全件表示 (2 回目 ) Session B の 1 5 のようにトランザクション中に読み取ったデータが 1 回目と 2 回目で異なる結果に なる現象 フゔントムリード が発生する SERIALIZABLE 読み出し可能なデータがトランザクション開始時点でコミット済みのデータに限られ かつ 問い合わせの結果が常に同じである隔離レベルです トランザクションの開始時点のデータが返されるトランザクションレベルの読み取り一貫性が提供されます ロストゕップデート ダーテゖーリード 反復不能読み取り フゔントムリード は発生しません 22

SERIALIZABLE 隔離レベルのトランザクション実行例の説明図 実際に SQL Server で確認すると以下のようになります ( 丸数字 SQL の実行される順番) Session A Session B ①売上実績の全件表示 1回目 ②売上実績を insert ③コミット ④売上実績の全件表示 23 ⑤売上実績の全件表示 2 回目 ⑥売上実績の全件表示

Session B の②ステーメントを実行するとロック待ち状態となります よって Session A の①と⑤で実行 結果の相違が発生しません SERIALIZABLE レベルでは 読み取り中のデータに対して データが追加/削除されることを防ぐことがで きます 分離レベルの変更 SQL Server において分離レベルを変更するには 以下のステートメントを実行します SELECT FROM テーブル名 WITH (分離レベル) またセッション単位で設定することも可能です 以下の SET ステートメントを実行します SET TRANSACTION ISOLATION LEVEL 分離レベル名 上記事例では このセッション単位での設定を実施しました 隔離レベルと発生する現象のまとめ これまでに説明したとおり トランザクションの隔離レベルが低い場合は同時に実行したトランザクション が互いに干渉しあい現象が発生します トランザクションの種類 (隔離レベル)と 発生する現象の対応関係 をまとめると下表のようになります また Oracle では 標準 SQL に定義されている 4 つの隔離レベル のうち READ COMMITED SERIALZABLE そして 標準 SQL で定義されていない 読み取り専用トランザクション の計 3 つ の隔離レベルを提供しています どの隔離レベルを使用するかは ゕプリケーションの特性や要件によって 決まります 高い隔離レベルを使用すると 同時に実行したトランザクションが干渉する現象は発生しなくなりますが 処理パフォーマンスが低下し 場合によってはエラーが発生する可能性があります 一方 低い隔離レベル を使用すると掃除実行時の処理パフォーマンスは向上しますが 反復不能読み取り フゔントムリード などの現象が発生します 隔離レベルとパフォーマンスはトレードオフの関係にあるため各隔離レベルの特性を理解してゕプリケーシ ョン要件に応じて使用する隔離レベルを決定します 24

隔離レベルと発生する現象のまとめ 25