Yabu.log

ITなどの雑記

Scheduleをpolygraphに変換してVSR validationを行う方法

多分Polygraphについて書かれた2番目の日本語のエントリー。*1

日本初のエントリー↓

taityo-diary.hatenablog.jp

内容としては先行している記事が複数の文献を参照していますが、このエントリはTheory of Database Concurrency Control p35~37の要約になっています。

polygraphとは

  • VSRのvalidationを行う特殊なグラフ
  • 定義:Polygraph P=(V,A,C)
    • V:vertex 頂点の集合
    • A:arc (V * V)
    • C:choice (V * V * V)

f:id:yuyubu:20191223001518p:plain

compatible

  • P=(V,A,C)と次の関係がある有向グラフD(V,B)をPとcompatibleという
    • A ⊂ B
    • 全てのchoice (u,v,w )⊂C ,(u,v)∈B または (v,w)∈B
  • 具体例次のPolygraph P1はD1,D2とcompatible

f:id:yuyubu:20191223001602p:plain

  • もう少し複雑な例

f:id:yuyubu:20191223001630p:plain

acyclic Pollygraph

次の性質を持つPolygraphをacyclicであるという

  • Polygraph PにcompatibleなDAGが存在する

Plygraphとcompatibleなグラフの中でacyclicなものが存在すれば、polygraphはacyclicであるという

スケジュールをPolygraphに変換する方法

複数のトランザクションの集合をscheduleとする

  • schedule sの全てのトランザクションの先頭にA_0と末尾にA_∞を含めた\hat{s} をVertices Vとする
    • A_0はs中に登場する全てのentity xに対するW(x)を含むトランザクションである
    • A_∞はs中に登場する全てのentity xに対するR(x)を含むトランザクションである
    • \hat{s}はaugmented scheduleと呼ばれることもある
  • Arcの作成:\hat{s}に存在する全てのトランザクションA中のRに対して以下の操作を行う

    • R_n(x)A_nの以前に存在している直近のWrite W_m(x)A_mからArc(A_m,A_n)を作成しPolygraph PのArc Aに追加する
      • 備考:通常、s中の全てのentity xに対してW(x)がA_0に存在しているため、\hat{s}にはWriteに後続しないReadは存在しない=arcはs中のRの数存在している
  • choiceの作成:arcを作成する際に使ったW_m(x) < R_n(x) に対してs中にA_mA_n以外のトランザクションA_oW_o(x)が存在する場合、choice(A_n,A_o,A_m)を作成しPolygraph PのCに追加する

    • A_o\hat{s}ではなく、sの要素であることに注意。(A_0,A∞はchoiceの中間ノードとして選択できない)
  • スケジュールsから作成したPolygraphをP(s)と表記する

P(s)とcompatibleに必要なもう一つの制約

P(s)とcompatibleなdigraph D=(V,B)はA0を支点とし、A∞を終点とするようなグラフではないといけない*2。つまり、以下に再掲するcompatileの条件にA0,A∞に関する制限が追加される。

全てのchoice (u,v,w )⊂C ,(u,v)∈B または (v,w)∈B

  • P(s)のCに A_0 を含んでいるchoice(A_m,A_n,A_0)があるとき、Bは(A_m,A_0)を含んではならない
  • P(s)のCに A_∞ を含んでいるchoice(A_∞,A_m,A_n)があるとき、Bは(A_∞,A_m)を含んではならない
  • この制約がないと、前者はA_0に先行するトランザクションが、後者はA_∞に後続するトランザクションが存在してしまっているようなおかしなscheduleが出来上がってしまう。

ScheduleからPolygraphを作成する具体例

  • 以下のスケジュールからPolygraphを作成する
s=r1(x)w2(y)w1(y)r3(x)w2(x)

A1:     R(x)        W(y)
A2:         W(y)            W(x)
A3:                 R(y)
  • Vertex Vはs中のA1,A2,A3にA_0,A_∞を加えた
    • V={A0,A1,A2,A3,A∞}
  • Arc Aは\hat{s}中の四つのreadと同一entityに対する直近のwriteから構成される
    • A={ (A0, A1), (A1, A3), (A1, A∞), (A2, A∞)}

f:id:yuyubu:20191223001705p:plain

  • choiceは各Arcを作っているstepと同一entityに対してs中の他のトランザクションがwriteを行なっているかを検査することで求めることができる 
    • C={(A1, A2, A0), (A3, A2, A1), (A∞, A2, A1)}
      • (A0,A1):xにより作られたArc→A2がW(x)を含んでいる→choice(A1,A2,A0)
      • (A1,A3):yにより作られたArc→A2がW(y)を含んでいる→choice(A3,A2,A1)
      • (A1,A∞):yにより作られたArc→A2がW(y)を含んでいる→choice(A∞,A2,A1)
      • (A2,A∞):xにより作られたArc→他のA∈sがW(x)を含んでいないためchoiceの追加はなし。
        • A0がW(x)しているのでは?と思われたかもしれませんが、定義を再確認し、choiceの中間ノードにA0,A∞は入らないことに注意してください

ビジュアライズ

必要な要素が出揃ったのでP(s)をビジュアライズする破線がchoiceのedge,実践がarcのedgeです。

s=r1(x)w2(y)w1(y)r3(x)w2(x)

P(s)
V={A0,A1,A2,A3,A∞}
A={ (A0, A1), (A1, A3), (A1, A∞), (A2, A∞)} 
C={(A1, A2, A0), (A3, A2, A1), (A∞, A2, A1)}

f:id:yuyubu:20191223001732p:plain

このP(s)はChoice (A1, A2, A0), (A∞, A2, A1)を含んでいる。A0,A∞とchoiceに関するルールにより、P(s)とCompatibleなdigraph(V,B)は必ずBに(A1,A2)と(A2,A1)を含んでいる。

  • A0,A∞とchoiceに関するルール再掲
    • P(s)のCにA_0を含んでいるchoice(A_m,A_n,A_0)があるとき、Bは(A_m,A_0)を含んではならない
    • P(s)のCにA_∞を含んでいるchoice(A_∞,A_m,A_n)があるとき、Bは(A_∞,A_m)を含んではならない

これにcompatibleなdigraphは(A1,A2)間で発生するcycleを持つためacyclicではない→P(s)はacyclicではない。

計算クラス

VSRの検査はNP完全です

詳しくはデヴすぴスラさんのブログを読んでください。概略だけ箇条書きしておきます

  • VSRのvalidationがNP完全
    • VSRのvalidationはpolygraphのcycle検出に多項式変換可能。
    • polygraphのcycle検出は2-3 simple CNF SATに多項式変換可能。
    • 2-3 simple CNF SATはNP完全
      • よって上記の問題は全てNP完全となる

dev-supisula.hatenablog.com

かなり難しい.実際は[エルブランセマンティクス(Herbrand Semantics)]と[Reads-From]で[VSR]を,[Multiversion Serialization Graph(MVSG)]で[MVSR]を定式化できるので,覚えなくてもいい.

scrapbox.io

だそうです。うーんすごく時間を無駄にした気分だ。

Theory of Database Concurrency Control

Theory of Database Concurrency Control

  • 作者:Christos Papadimitriou
  • 出版社/メーカー: Computer Science Pr
  • 発売日: 1986/07/01
  • メディア: ハードカバー

*1:Polygraph VSRとかで日本語onlyでググるとパトさんのブログくらいしか出てこない

*2:P36 in all digraphs compatible with P(s), A0 must precede all other transactions, and all transactions must precede A∞