Sybaseの分離レベル
〜Isolation Level〜
0.改訂履歴
- 2002.08.16 新規作成
- 2002.09.06 その他のデータベース情報の追加.
1.はじめに
このドキュメントでは,Sybaseにおける分離レベルについて説明する.
2.分離レベルとは
- Sybaseのような,複数ユーザが同時に接続して処理を行うRDBMSでは,複数のトランザクションが同時に発生する事になる.
- その時,共通のデータ(テーブル等)にアクセスすると,お互いにデータを上書きしたり等の衝突が発生する.
- RDBMSでは,同時に実行されるトランザクションが,お互いに干渉せずにデータ整合性を保つ仕組みが必要となる.
- データの整合性が保たれない一例を「ダーティリード」と呼んだりする.
- 意識的にダーティリードを許す場合もあるので,名前のイメージとは違い,悪い事ではない.
- その仕組みはいくつかあり,それを分離レベル(Isolation Level)という.
- ANSI規格では,以下の4つが定義されている.
READ UNCOMMITTED |
READ COMMITTED |
REPEATABLE READ |
SERIALIZABLE |
- 分離レベルによって,データに対してどのタイミングでロックを取得するかを決定される.
- 分離レベルは,意識しなければRDBMSのデフォルトを採用しているが,セッション時に変更する事もできる.
3.Sybaseの分離レベル
- RDBMSの実装によって,分離レベルの動作が違ったりするが,このドキュメントではタイトル通りにSybaseについて分離レベルの説明を行う.
Isolation Level | 設定値 | 説明 |
---|---|---|
Read Uncommitted | 0 | ダーティリードが可能となる. |
Read Committed | 1 | これがSybaseのデフォルト. テーブルロックやページロックを発行する事でダーティリードできないようにする. つまり,トランザクションがコミットするまでは読み出しできない. |
Serializable Transactions |
3 | トランザクション間のダーティリード,nonrepeatable read,ファントム値を禁止する. |
4.Read Uncommitted
- タイトルの通り,「コミットされていないデータを読めちゃう」という分離レベル.
- これを説明すると,次のようになる.
Step | Session 1 | Session 2 | 説明 |
---|---|---|---|
1 | begin transaction select * from EMP go |
Session 1でトランザクションの開始. | |
2 | begin transaction select * from EMP go |
Session 2でトランザクションの開始. この時点ではEMPテーブルのデータを読み込める. |
|
3 | update EMP set A = 1 where B > 1000 |
Session 1でEMPテーブルのデータをアップデート. | |
4 | select * from EMP go |
Session 2でデータを読み込めるが,Session 2のStep2の値と同じ. | |
5 | commit | Session 1を確定. | |
6 | select * from EMP go |
Session 1のStep3でで変更されたデータになる. |
- 他のトランザクションが何してようと気にしない(同期を取らない)自分勝手な処理なので,心配事がないので軽いと考えられる.
- ただし,ある時点のデータがどのようになっているか不明となる.
5.Read Committed
- これもタイトル通りに読むと,「コミットしたデータしか読まないよ」という分離レベル.
- ロックの単位をよく考えないと,処理待ちが多く発生して遅延してしまうので注意.
- とはいえ,デフォルトがこの設定だったりする.
Step | Session 1 | Session 2 | 説明 |
---|---|---|---|
1 | begin transaction select * from EMP go |
Session 1でトランザクションの開始. | |
2 | begin transaction select * from EMP go |
Session 2でトランザクションの開始. この時点ではEMPテーブルのデータを読み込める. |
|
3 | update EMP set A = 1 where B > 1000 |
Session 1でEMPテーブルのデータをアップデート. | |
4 | select * from EMP go |
Session 2でデータを読み込めない. Session 1が終了(Commit or Rollback)するのを待っている. |
|
5 | commit | session1を確定. | |
6 | Step4の処理結果が表示される. |
6.Serializable Transactions
- 名前の通り,トランザクションが同時実行ではなく,順番に1つづつ実行される.
- この分離レベルが一番厳密な(厳しい)もの.
- このレベルで動作の場合,トランザクション開始以前のデータだけが対象となる.
- そのトランザクションの開始以降に他のトランザクションで更新されたデータを変更できない.
- この方法を使うと,デッドロックが発生する可能性が高くなる.
7.ダーティリード
- コミットしてないトランザクションが変更したデータを,別のトランザクションが変更することを禁止する.
- 変更はできないが,別トランザクションで読み出せる.
- Read Uncommittedの事.
- よって,何度も読み出していると,毎回違う値になる場合がある.
- 途中結果にて正確性を必要としないトランザクションで利用する.
8.反復不可能読み取り(nonrepeatable read)
- 繰り返しデータを読み込むと,毎回データが違う状態.
Step | 店員 | 倉庫の管理者 | 説明 |
---|---|---|---|
1 | begin tran select 数量 from 在庫 |
数量が10だった. その結果を変数Aに入れている. |
|
2 |
begin tran update 在庫 set 数量= 数量 + 5 commit |
5個入庫したので,既存の数値に足した. 瞬間的にトランザクションが終了している. |
|
3 |
update 在庫 set 数量= A - 5 commit |
5個売れたので,先ほど取得した変数Aから残り5引いた数に設定した. | |
4 | select 数量 from 在庫 | 更新されたか確認すると,あら不思議? |
- 動き的には正しいが,処理によってはトランザクション中は誰にもデータをさわらせない様にしたい場合がある.
9.ファントム値
- トランザクション中に現れたり消えたりするお化け(Phantoms)のようなデータの事.
- 1番目のトランザクションが,検索である範囲の行セットを読み込む.
- 2番目のトランザクションが,INSERT,UPDATE,DELETE等でそのデータを変更する.
- 1番目のトランザクションが,再度データを読み込むと値が変わっている.
- ということらしいが,反復不可読みとりとどう違うのか,よく変わってないです.
10.データベース製品の分離レベルサポート一覧
- 主な製品について,以下にまとめる.
SQL92 | Oracle | Sybase | DB2 |
---|---|---|---|
Uncommitted Read |
/
|
Read Uncommitted | Uncommitted Read |
Read Committed | Read Committed★ | Read Committed★ | Cursor Stability (カーソル固定)★ |
Repeatable Read |
/
|
Repeatable Read | Read Stability (読みとり固定) |
Serializable | Serializable | Serializable | Repeatable Read |
/
|
Read Only |
/
|
/
|
★印は,そのプロダクトのデフォルト.