SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
Isolation Level について
星野 喬
1
概要
• 用語整理
• Serializability, Isolation, Consistency…
• SQL標準の Isolation Level
• Adya の整理
2
Serializabilty
• 日本語では「直列化可能性」
• トランザクション達を直列に実行したのと等価と見做せること
• View 等価 (意味論 Herbrand semantics でも等価)
• Conflict 等価 (扱いやすくするため View 等価より制約が強い)
• Linearizability (線形化可能性) とは異なる概念なので注意
• Linearizability は新しいデータを読める性質(トランザクション抽象ナシ)
• Operation 1 個しか含まないトランザクションの集合という仮定の元で、
Linearizable = Strict serializable
3
Consistency という言葉の混乱
• (1) ACID の C(consistency)
• DBMS がアプリケーションに提供するデータベース状態制約機能
• (2) 並列分散界隈の Consistency
• 新しいデータを読めるか(or 一貫性のあるデータを読めるか)
• (3) Adya1999 の Consistency
• Isolation とあまり区別してないが Realtime 性の話が若干入ってそう
• 広い意味では Isolation も含め Consistency と呼びたい(by 星野)
• アプリケーションがデータとその振る舞いに求める不変条件を満たすことが
ゴール
• しばしば暗黙的 (例: Sequential consistency でないとバグるアルゴリズム)
4
Isolation Level とは
• Serializability が欲しいけど、性能とのトレードオフがある
• みんな大好き Snapshot Isolation、Read Committed、Repeatable Read…
• Serializability の保証がなくても足りることもある
• アプリケーション側が DBMS に歩み寄る必要もしばしばある
(Select に For update をつけるとか、排他用の Record を用意するなど)
• Level (段階) 感がある
• SQL標準規格では本当に Level として規定されている
• 当時は Level とか Degree などの言葉で表現されていた by Adya
5
SQL標準規格
• ANSI X3.135-1992, American National Standard for
Information Systems – Database Language – SQL, 1992
• いわゆる SQL92
• 最新は SQL:2019 (たぶん)
• Isolation 周りは変わってないと思われる
• 「現象」(or 振舞い)を元にした Informal な定義 by Adya
• 2 通りの解釈: Anomaly 解釈と Preventative 解釈
6
SQL標準における「現象」の分類
• Anomaly 解釈は問題があるので Preventative 解釈が前提 by Adya
• P0: 𝑡1 と 𝑡2 が 𝑥 を Concurrent に Write (どちらの結果を残すか不明)
• P1: 𝑡1 の書いた 𝑥 を 𝑡1 commit 前に read し、𝑡1 が abort する (𝑡2 は commit 不可能)
• P2: 𝑡1 が読んだ 𝑥 を 𝑡1 が commit する前に上書きする (𝑡1 は 𝑡2 の書いたものを読むべき)
• P3: 𝑡1 が predicate read して 𝑡1 が commit する前に predicate read の結果が変わるような書
き込みをする (𝑡1 は 𝑡2 の変更を反映した predicate read 結果を観測すべき)
7
SQL 標準の Isolation Level
• SQL 標準は Lock による CC (Concurrency control) 設計にべったり
• SQL 標準の Serializable を(ここでは) ANSI-Serializable と呼ぶ
8
Bere1995
• A Critique of ANSI SQL Isolation Levels
• H. Berenson, et al., 1995, SIGMOD Conference
• ANSI-Serializable は Serializable じゃないよ
• Snapshot isolation (SI) は ANSI-Serializable だけど Serializable じゃないよ
• SI では Write skew anomaly が発生するよ
• (後の論文で、SI では read-only transaction anomaly もあると判明)
• (Anomaly 解釈は正しくない、と言ったのもこの論文 by Adya)
9
Adya1999
• Weak Consistency: A Generalized Theory and Optimistic
Implementations for Distributed Transactions
• Atul Adya, 1999, Doctor Thesis
• モチベーション
• SQL標準の Isolation Level 勘弁してくれ
• 貢献
• より良い Isolation 分類(のためのモデル)の提案
• 注意点
• Adya は MVCC や OCC を統一的に扱うため Version order を基準にして
Conflict を定義するが、ここでは素直に (Write) operation order を用いる
10
Adya1999 が指摘する SQL 標準の問題点
• 定義が曖昧である
• (Anomaly 解釈は間違っているので Preventative 解釈を使うべき
by Bare1995)
• Lock 前提の枠組みなので、汎用的ではない
• (Preventative 解釈だと) 制限的すぎて、最近の CC protocol (OCC とか MVCC)
が同等の Isolation level において通すスケジュールが規格では違反扱いとなっ
てしまう
• CC 設計や実装依存だけでなく、永続化に関する余計な性質が混ざっている
(要確認)
11
Isolation 関係図 by Adya
• PL-1
• PL-2
• PL-2.99 (Repeatable Read)
• PL-3 (Full Serializability)
• PL-2+ (Consistent View)
• PL-SI (Snapshot Isolation)
• 他
12
Figure 4.1 A partial order to relate various isolation levels.
Adya1999 の分類 (一部)
• モデルを用いて明確に、G0, G1, G2 他の禁止する現象を定義
13
Adya1999 のモデル
• 従来の Page model (for mono-version)
• 複数のオペレーション (Op) から成るトランザクション (Tx) が複数
• Op は主に read/write
• Op order が与えられる
(Tx の Concurrent 実行を Op order における Interleaving で表現)
• Standard version function (Op order における直前の値を読む) が前提
• Adya は従来の Page model を拡張
• Conflict-based アプローチ
• いわゆる w-r、w-w、r-w 関係でグラフ構造を作って Acyclic かどうか
• Op order の代わりに Multi-version 向けの Version order を使用
• だから従来の Conflict serializability での定義とは若干異なる
• Phantom も扱うため Predicate read/write が Op として入ってる
14
Conflict of Adya1999
• Directly read-dependency
• reads-from 関係のこと (直前の write と read の関係、狭義の w-r)
• Directly write-dependency
• 連続する write と write の関係 (狭義の w-w)
• Directly anti-dependency
• read と、それを直接上書きする write の関係 (狭義の r-w)
• Directly conflict := Directly read/write/anti dependency
• Dependency := Transitive read/write dependency
• Conflict := Transitive conflict
• Predicate 絡みのものも含まれるが複雑なので省略
• Adya1999 では Version order の「直前」だが、簡単のため Op order を使用
15
DSG (Direct Serialization Graph)
• Direct conflict 関係から構築した Graph 構造
• DSG = (V, E) where
• V: Transactions
• (t1, t2) in E: t2 directly depends on t1
• (Transitive) conflict は Path
16
Condition G0
• G0: Write Cycles
• Write dependency のみで構成される DSG の Cycles
• PL-1: G0 を禁止
• 所感
• Mono-version 前提なら分かる
• Multi-version だとそもそも Version order だけで Order になってないとい
う状況に対応するのでモデルに含める意味を感じない
17
Condition G1
• G1a: Aborted Reads
• 𝑤1 𝑥 𝑟2 𝑥 … 𝑎1𝑐2
• G1b: Intermediate Reads
• 𝑤1 𝑥1𝑎 𝑟2 𝑥1𝑎 𝑤1 𝑥1𝑏 … 𝑐2
• G1c: Circular Information Flow
• Dependency のみで構成された DSG の Cycles (G0 を含む)
• PL-2: G1 (= G1a+G1b+G1c) を禁止
• 所感
• G1a は永続化要件だと思う(から CC は関係ない派)
• G1b は two-step model では発生しないから CC 設計の詳細に見える
18
Condition G2
• G2: Anti-dependency Cycles
• ひとつ以上の Anti-dependency を含む Cycles
• PL-2.99: G1 と G2-item (predicate 除く) 禁止
• PL-3: G1 と G2 禁止
19
まとめと感想
• SQL標準の Isolation Level には種々の問題があった
• Adya1999 は明確なモデルでそれを整理
• 当時実用されていた Snapshot Isolation をちゃんと含めたことは大きい
• (この資料では説明してないけど)
• 2022年から見て
• Predicate を組込むのは筋悪だと感じるし、Adya の整理は分かりにくい
(層を分けても良いのでは)
• もう Mono-version のモデルから議論を始めるのをやめましょうよ
20

Mais conteúdo relacionado

Mais procurados

A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用Takashi Kambayashi
 
普通の人でもわかる Paxos
普通の人でもわかる Paxos普通の人でもわかる Paxos
普通の人でもわかる Paxostyonekura
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクションAkio Mitobe
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)Takanori Sejima
 
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~NTT DATA OSS Professional Services
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンKentaro Yoshida
 
OCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰するOCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰するKohei Tokunaga
 
Transactional Information Systems入門
Transactional Information Systems入門Transactional Information Systems入門
Transactional Information Systems入門nobu_k
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)Uptime Technologies LLC (JP)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 

Mais procurados (20)

A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用
 
普通の人でもわかる Paxos
普通の人でもわかる Paxos普通の人でもわかる Paxos
普通の人でもわかる Paxos
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクション
 
Paxos
PaxosPaxos
Paxos
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
 
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
MVSR Schedulerを作るための指針
MVSR Schedulerを作るための指針MVSR Schedulerを作るための指針
MVSR Schedulerを作るための指針
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
これがCassandra
これがCassandraこれがCassandra
これがCassandra
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
リペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudy
リペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudyリペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudy
リペア時間短縮にむけた取り組み@Yahoo! JAPAN #casstudy
 
OCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰するOCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰する
 
Transactional Information Systems入門
Transactional Information Systems入門Transactional Information Systems入門
Transactional Information Systems入門
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 

Mais de Takashi Hoshino

Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何かTakashi Hoshino
 
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3Takashi Hoshino
 
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38Takashi Hoshino
 
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25Takashi Hoshino
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Takashi Hoshino
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法Takashi Hoshino
 
メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介Takashi Hoshino
 
10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーションTakashi Hoshino
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤTakashi Hoshino
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージTakashi Hoshino
 
Intel TSX 触ってみた 追加実験 (TTAS)
Intel TSX 触ってみた 追加実験 (TTAS)Intel TSX 触ってみた 追加実験 (TTAS)
Intel TSX 触ってみた 追加実験 (TTAS)Takashi Hoshino
 
Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiTakashi Hoshino
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Takashi Hoshino
 
An Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageAn Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageTakashi Hoshino
 
ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法Takashi Hoshino
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86optiTakashi Hoshino
 
WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.Takashi Hoshino
 
VMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsVMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsTakashi Hoshino
 

Mais de Takashi Hoshino (20)

Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何か
 
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
データベースシステムにおける直列化可能性と等価な時刻割り当てルールの提案 rev.3
 
WalB Driver Internals
WalB Driver InternalsWalB Driver Internals
WalB Driver Internals
 
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38
 
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法
 
メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介メモリより大きなデータの Sufix Array 構築方法の紹介
メモリより大きなデータの Sufix Array 構築方法の紹介
 
WalBの紹介
WalBの紹介WalBの紹介
WalBの紹介
 
10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション10分で分かるバックアップとレプリケーション
10分で分かるバックアップとレプリケーション
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージ
 
Intel TSX 触ってみた 追加実験 (TTAS)
Intel TSX 触ってみた 追加実験 (TTAS)Intel TSX 触ってみた 追加実験 (TTAS)
Intel TSX 触ってみた 追加実験 (TTAS)
 
Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86opti
 
Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介Suffix Array 構築方法の紹介
Suffix Array 構築方法の紹介
 
An Efficient Backup and Replication of Storage
An Efficient Backup and Replication of StorageAn Efficient Backup and Replication of Storage
An Efficient Backup and Replication of Storage
 
ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法ログ先行書き込みを用いたストレージ差分取得の一手法
ログ先行書き込みを用いたストレージ差分取得の一手法
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86opti
 
WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.WalB: Block-level WAL. Concept.
WalB: Block-level WAL. Concept.
 
VMware Backup in Cybozu Labs
VMware Backup in Cybozu LabsVMware Backup in Cybozu Labs
VMware Backup in Cybozu Labs
 

Isolation Level について

  • 2. 概要 • 用語整理 • Serializability, Isolation, Consistency… • SQL標準の Isolation Level • Adya の整理 2
  • 3. Serializabilty • 日本語では「直列化可能性」 • トランザクション達を直列に実行したのと等価と見做せること • View 等価 (意味論 Herbrand semantics でも等価) • Conflict 等価 (扱いやすくするため View 等価より制約が強い) • Linearizability (線形化可能性) とは異なる概念なので注意 • Linearizability は新しいデータを読める性質(トランザクション抽象ナシ) • Operation 1 個しか含まないトランザクションの集合という仮定の元で、 Linearizable = Strict serializable 3
  • 4. Consistency という言葉の混乱 • (1) ACID の C(consistency) • DBMS がアプリケーションに提供するデータベース状態制約機能 • (2) 並列分散界隈の Consistency • 新しいデータを読めるか(or 一貫性のあるデータを読めるか) • (3) Adya1999 の Consistency • Isolation とあまり区別してないが Realtime 性の話が若干入ってそう • 広い意味では Isolation も含め Consistency と呼びたい(by 星野) • アプリケーションがデータとその振る舞いに求める不変条件を満たすことが ゴール • しばしば暗黙的 (例: Sequential consistency でないとバグるアルゴリズム) 4
  • 5. Isolation Level とは • Serializability が欲しいけど、性能とのトレードオフがある • みんな大好き Snapshot Isolation、Read Committed、Repeatable Read… • Serializability の保証がなくても足りることもある • アプリケーション側が DBMS に歩み寄る必要もしばしばある (Select に For update をつけるとか、排他用の Record を用意するなど) • Level (段階) 感がある • SQL標準規格では本当に Level として規定されている • 当時は Level とか Degree などの言葉で表現されていた by Adya 5
  • 6. SQL標準規格 • ANSI X3.135-1992, American National Standard for Information Systems – Database Language – SQL, 1992 • いわゆる SQL92 • 最新は SQL:2019 (たぶん) • Isolation 周りは変わってないと思われる • 「現象」(or 振舞い)を元にした Informal な定義 by Adya • 2 通りの解釈: Anomaly 解釈と Preventative 解釈 6
  • 7. SQL標準における「現象」の分類 • Anomaly 解釈は問題があるので Preventative 解釈が前提 by Adya • P0: 𝑡1 と 𝑡2 が 𝑥 を Concurrent に Write (どちらの結果を残すか不明) • P1: 𝑡1 の書いた 𝑥 を 𝑡1 commit 前に read し、𝑡1 が abort する (𝑡2 は commit 不可能) • P2: 𝑡1 が読んだ 𝑥 を 𝑡1 が commit する前に上書きする (𝑡1 は 𝑡2 の書いたものを読むべき) • P3: 𝑡1 が predicate read して 𝑡1 が commit する前に predicate read の結果が変わるような書 き込みをする (𝑡1 は 𝑡2 の変更を反映した predicate read 結果を観測すべき) 7
  • 8. SQL 標準の Isolation Level • SQL 標準は Lock による CC (Concurrency control) 設計にべったり • SQL 標準の Serializable を(ここでは) ANSI-Serializable と呼ぶ 8
  • 9. Bere1995 • A Critique of ANSI SQL Isolation Levels • H. Berenson, et al., 1995, SIGMOD Conference • ANSI-Serializable は Serializable じゃないよ • Snapshot isolation (SI) は ANSI-Serializable だけど Serializable じゃないよ • SI では Write skew anomaly が発生するよ • (後の論文で、SI では read-only transaction anomaly もあると判明) • (Anomaly 解釈は正しくない、と言ったのもこの論文 by Adya) 9
  • 10. Adya1999 • Weak Consistency: A Generalized Theory and Optimistic Implementations for Distributed Transactions • Atul Adya, 1999, Doctor Thesis • モチベーション • SQL標準の Isolation Level 勘弁してくれ • 貢献 • より良い Isolation 分類(のためのモデル)の提案 • 注意点 • Adya は MVCC や OCC を統一的に扱うため Version order を基準にして Conflict を定義するが、ここでは素直に (Write) operation order を用いる 10
  • 11. Adya1999 が指摘する SQL 標準の問題点 • 定義が曖昧である • (Anomaly 解釈は間違っているので Preventative 解釈を使うべき by Bare1995) • Lock 前提の枠組みなので、汎用的ではない • (Preventative 解釈だと) 制限的すぎて、最近の CC protocol (OCC とか MVCC) が同等の Isolation level において通すスケジュールが規格では違反扱いとなっ てしまう • CC 設計や実装依存だけでなく、永続化に関する余計な性質が混ざっている (要確認) 11
  • 12. Isolation 関係図 by Adya • PL-1 • PL-2 • PL-2.99 (Repeatable Read) • PL-3 (Full Serializability) • PL-2+ (Consistent View) • PL-SI (Snapshot Isolation) • 他 12 Figure 4.1 A partial order to relate various isolation levels.
  • 13. Adya1999 の分類 (一部) • モデルを用いて明確に、G0, G1, G2 他の禁止する現象を定義 13
  • 14. Adya1999 のモデル • 従来の Page model (for mono-version) • 複数のオペレーション (Op) から成るトランザクション (Tx) が複数 • Op は主に read/write • Op order が与えられる (Tx の Concurrent 実行を Op order における Interleaving で表現) • Standard version function (Op order における直前の値を読む) が前提 • Adya は従来の Page model を拡張 • Conflict-based アプローチ • いわゆる w-r、w-w、r-w 関係でグラフ構造を作って Acyclic かどうか • Op order の代わりに Multi-version 向けの Version order を使用 • だから従来の Conflict serializability での定義とは若干異なる • Phantom も扱うため Predicate read/write が Op として入ってる 14
  • 15. Conflict of Adya1999 • Directly read-dependency • reads-from 関係のこと (直前の write と read の関係、狭義の w-r) • Directly write-dependency • 連続する write と write の関係 (狭義の w-w) • Directly anti-dependency • read と、それを直接上書きする write の関係 (狭義の r-w) • Directly conflict := Directly read/write/anti dependency • Dependency := Transitive read/write dependency • Conflict := Transitive conflict • Predicate 絡みのものも含まれるが複雑なので省略 • Adya1999 では Version order の「直前」だが、簡単のため Op order を使用 15
  • 16. DSG (Direct Serialization Graph) • Direct conflict 関係から構築した Graph 構造 • DSG = (V, E) where • V: Transactions • (t1, t2) in E: t2 directly depends on t1 • (Transitive) conflict は Path 16
  • 17. Condition G0 • G0: Write Cycles • Write dependency のみで構成される DSG の Cycles • PL-1: G0 を禁止 • 所感 • Mono-version 前提なら分かる • Multi-version だとそもそも Version order だけで Order になってないとい う状況に対応するのでモデルに含める意味を感じない 17
  • 18. Condition G1 • G1a: Aborted Reads • 𝑤1 𝑥 𝑟2 𝑥 … 𝑎1𝑐2 • G1b: Intermediate Reads • 𝑤1 𝑥1𝑎 𝑟2 𝑥1𝑎 𝑤1 𝑥1𝑏 … 𝑐2 • G1c: Circular Information Flow • Dependency のみで構成された DSG の Cycles (G0 を含む) • PL-2: G1 (= G1a+G1b+G1c) を禁止 • 所感 • G1a は永続化要件だと思う(から CC は関係ない派) • G1b は two-step model では発生しないから CC 設計の詳細に見える 18
  • 19. Condition G2 • G2: Anti-dependency Cycles • ひとつ以上の Anti-dependency を含む Cycles • PL-2.99: G1 と G2-item (predicate 除く) 禁止 • PL-3: G1 と G2 禁止 19
  • 20. まとめと感想 • SQL標準の Isolation Level には種々の問題があった • Adya1999 は明確なモデルでそれを整理 • 当時実用されていた Snapshot Isolation をちゃんと含めたことは大きい • (この資料では説明してないけど) • 2022年から見て • Predicate を組込むのは筋悪だと感じるし、Adya の整理は分かりにくい (層を分けても良いのでは) • もう Mono-version のモデルから議論を始めるのをやめましょうよ 20