 |
|
1 2 3 4 次のページ
|
 |
トランザクションの分離レベル
|
これまでの連載でGUIツールを使用したデータベース構築を比較してきました。今回は、運用まわりに主眼をおきそれぞれの機能比較を紹介していく。
まずロックとトランザクションの分離についてだが、これはアプリケーションから見たデータの整合性を維持する機能であり、データベースにとって重要な機能である。なぜならば、複数のユーザが同時にデータを参照・更新を行った時に、変更中のデータ参照や同じデータへの同時更新を防止するからだ。
トランザクションの分離に関してはANSI/ISO SQL規格(SQL92)で規定されており、4つの分離レベルが定義されている。トランザクションは「開始宣言→データの操作→コミット命令」の流れで行うことが基本であり、コミットを行うまでデータ操作が確定しない仕組みである。トランザクションの分離レベルは、あるユーザがトランザクションを行っている途中で同じデータを別のユーザが読み出す時に発生する現象の組み合わせで分類されており、項番が大きいほど分離レベルが高く、一般的にパフォーマンスが低下する(表1)。
項番 |
レベル |
ダーティリード |
ノンリピータブルリード |
ファントムリード |
1 |
READ UNCOMMITTED |
許容 |
許容 |
許容 |
2 |
READ COMMITTED |
抑止 |
許容 |
許容 |
3 |
REPEATABLE READ |
抑止 |
抑止 |
許容 |
4 |
SERIALIZABLE |
抑止 |
抑止 |
抑止 |
表1:SQL92のトランザクション分離レベル
- ダーティリード
- コミット前の更新データが参照されること
- ノンリピータブルリード
- トランザクション内で一度読み込んだデータを再読み込みした場合、他のトランザクションで更新されたデータに変わってしまうこと
- ファントムリード
- トランザクション内で条件検索を行った後に再度同じ条件検索を行った場合、他のトランザクションの挿入操作により異なる結果になること
表2:表1の各リードの注
各データベースの対応状況を表3に示す。
項番 |
レベル |
SQL Server |
MySQL |
PostgreSQL |
1 |
READ UNCOMMITTED |
○ |
○ |
項番2で動作 |
2 |
READ COMMITTED |
◎ |
○ |
◎ |
3 |
REPEATABLE READ |
○ |
◎ |
項番4で動作 |
4 |
SERIALIZABLE |
○ |
○ |
○ |
表3:各データベースの対応状況
(◎:デフォルト値)
SQL Server 2005とMySQLは4つの分離レベルに対応した機能を実装している。一方、PostgreSQLは「READ COMMITTED」と「SERIALIZABLE」を実装し、「READ UNCOMMITTED」や「REPEATABLE READ」が指定された場合は、上位のトランザクションの分離レベルで動作する仕様となっている。
PostgreSQLのマニュアルでも記述されているが、標準SQLの許される範囲である。また、分離レベルに関して先駆者的な存在であるOracleもすべてを対応しているわけではなく、網羅性が優劣を決めるものではない。むしろ分離レベルのデフォルトが何になっているかと、分離レベルとパフォーマンスの関係が重要である。
|
1 2 3 4 次のページ
|

|
|

|
著者プロフィール
株式会社日立システムアンドサービス 鈴木 和義
研究開発センタ 評価センタ 主任技師。サービス視点で各社製品の評価・選定に10年以上携わる。また、2005年からIPAのOSS推進フォーラムに参加し、オープンソースのAPサーバの信頼性を評価している。
|
|
|
|