トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション
Oracleキーワードから学ぶ、逆引き! SQL Server入門
文=株式会社CSK 教育サービス事業部
第7回
トランザクション/ロック編 スペシャルキーワード
読み取り一貫性
データベースでは、データの整合性や一貫性を保証するために「ロック」や「読み取り一貫性」といった機能が使われます。Oracle Server とSQL Serverでは、これらの仕組みが大きく異なります。

読み取り一貫性の実現方法の違い


Oracle Serverでは、通常のSELECTではロックがかかりません(SELECT FOR UPDATEは除く)。トランザクション途中のデータを他のユーザーがSELECTした場合、UNDOセグメントにある変更前のコミット済みデータを読み込み、読み取り一貫性を保証します。一方、SQL Serverでは、UNDOセグメントに相当するものはありません。読み取り一貫性は、ロックメカニズムを使用して実現します。

ロックがかけられているデータに対してSELECT文を実行した場合の動作は、それぞれ下の図のとおりです。

■ 図1 :Oracle Serverの場合
図1 Oracle Serverの場合

■ 図2 :SQL Serverの場合
図1 Oracle Serverの場合


SQL Serverでは、次に紹介するロックを使用して、読み取り一貫性を実現します。



ロックの種類


Oracle Serverの主なロックは、「共有ロック」と「排他ロック」の2種類です。一方、SQL Serverの主なロックは、次の表に示す3種類です。ロックの互換性とは、ロックを同時にかけられるかどうかということです。

種類 説明 ロックの互換性
共有ロック SELECTステートメントなど、データの変更をしない読み取り専用の処理で使用します。既定では、読み取り終了時に解放されます。 共有、更新ロックと互換性あり
排他ロック INSERT、UPDATE、DELETEなど、データの変更の処理で使用します。同時更新による不整合を防ぐためのロックです。トランザクション終了時に開放されます。 互換性なし
更新ロック 更新予定のリソースで使用します。1つのリソースをロックできるトランザクションは1つのみで、更新の直前に排他ロックに変わります。トランザクション終了時まで保持されます。 共有ロックのみ
互換性あり

●共有ロックと排他ロック
上記【図2】の例で、Aさんが「ぷちっとプリン」のデータを更新した場合、UPDATEステートメントを実行すると排他ロックがかかり、それはトランザクション終了時まで保持されます。そのデータをBさんがSELECTすると共有ロックがかけられますが、共有ロックと排他ロックは互換性がないので、Bさんは待つことになります。

●更新ロックの使用
Oracle Serverでいう「SELECT〜FOR UPDATE」のような使い方です。SELECTしてから更新するような場合に発生するデッドロックを防ぐために、ロックヒントのUPDLOCKを指定して使用します。このロックは更新の直前に排他ロックに変わり、トランザクション終了時まで保持されます。



ロックの制御


SQL Serverでは、実行したSQLステートメントによって自動的に最適なロックが選択されますが、次の方法で制御することもできます。

セッション レベル
● SET TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED :SELECT時にロックがかからない
READ COMMITTED(既定) :SELECT時にロックがかかる

テーブル レベル
● FROM テーブル名 WITH ロックヒント
NOLOCK :ロックがかからない
ROWLOCK :行レベルでロックがかかる
TABLOCK :表レベルでロックがかかる
UPDLOCK :更新ロックがかかる

ロック タイムアウト
● SET LOCK_TIMEOUT 経過時間
1(既定) :無制限に待つ
0 :待ち時間なし。ロックがかかっているとすぐにエラーが返される
N :経過時間をミリ秒で指定。経過時間を過ぎるとエラーが返される



まとめ 〜SELECT時の注意点〜


SQL Serverでは、SELECTでも『待ち』が発生する可能性があります。更新する側でもトランザクションを短くするなどの工夫が必要ですが、SELECTする側でも「ロック タイムアウトを指定する」、「WHERE句で条件を絞り、必要なデータのみ読込む」など、不要な『待ち』を防ぐための注意が必要です。




・ 第1回 基本用語編:データベースオブジェクト
・ 第2回 ユーティリティ編:SQL*Plus
・ 第3回 アーキテクチャ編(1):インスタンスとデータベース
・ 第4回 アーキテクチャ編(2):セグメント/エクステント/データブロック
・ 第5回 アーキテクチャ編(3):索引
・ 第6回 プログラミング編:カーソル
・ 第7回 トランザクション/ロック編:読み取り一貫性
・ 第8回 バックアップとリカバリ編:スタンバイ・データベース
・ 第9回 ユーザー管理編:ロール
・ 第10回 パフォーマンスチューニング編:EXPLAIN PLAN(実行プランの表示)


著者プロフィール
株式会社CSK 教育サービス事業部
http://www.cskedu.com/
OracleとSQL Server、それぞれのトレーニングコースを担当するトレーナー3名体制で執筆しています。メンバーは、金子真由美、浦山裕恭、浅見淳子。
今回の執筆担当
浅見淳子(ASAMI, Junko)
OracleデータベースとSQL Server、両方のインストラクターを担当しています。Oracleユーザー歴の方が長いので、SQL ServerとOracleとの違いに驚かされることがしばしば。ちなみに埼玉出身ですが、お酒はけっこう強い(?)です。

← 特集!DBバイリンガル 目次

PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.