ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

トランザクションで w-w はなぜ Lost Update ではないか?

課題

db tech showcase Tokyo 2018 (db tech showcase Tokyo 2018 | db tech showcase)
でノーチラステクノロジーズ 神林さんが以下のテーマで講演されました。
MVCCにおけるw-w/w-r/r-wのあり方とcommit orderのあり方の再検討~Sundial: Harmonizing Concurrency Control and Caching in a Distributed OLTP Database Management Systemを題材に

講演の中で
w1(x1) w2(x2) c2 c1
※ r : read, w : write, c : commit, a : abort, x : item(添字は書き込んだトランザクションの番号)
が Lost Update ではないと説明がありました。ただし、その詳細については各自の宿題ということで解説はスキップされています。

これについて、私なりの理解をまとめます。結論として、これは Dirty Write であり、Lost Update ではありません。以下で説明します。

説明のベースとして "A Critique of ANSI SQL Isolation Levels" (以下、Isolation論文)を参照します。

Isolation論文のリンク:
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf

神林さんによるIsolation論文解説スライド(今回の講演スライドではありません):

Dirty Write

Isolation論文で Dirty Write (P0) は以下の定義としています。

P0 (Dirty Write): Transaction T1 modifies a data item. Another transaction T2 then further modifies that data item before T1 performs a COMMIT or ROLLBACK. If T1 or T2 then performs a ROLLBACK, it is unclear what the correct data value should be.
(中略)
P0: w1[x]...w2[x]...(c1 or a1) (Dirty Write)

今回の課題のスケジュールである、
w1(x1) w2(x2) c2 c1
は P0 に合致します。

このスケジュールは1V、つまりアイテム毎に最新の値しか保持できないケースで困ります。元のスケジュール順で実行した場合、最後のc1はxの値がx1となることを期待しているはずですが、w2(x2)で上書きされてしまっているからです。

ですが、このスケジュールは S2PL で T1 → T2 の Serializable になります。
ここではロックをl、Unlockをuとします。また、xの添字を外します。

オリジナルのスケジュール:
w1(x) w2(x) c2 c1

S2PL:
l1(x) w1(x) c1 u1(x) l2(x) w2(x) c2 u2(x)

これが講演スライドの「勝手にロックが働く」の意味となります。

Lost Update

Isolation論文の Lost Update (P4) の定義と例をまとめて引用します。

P4 (Lost Update): The lost update anomaly occurs when transaction T1 reads a data item and then T2 updates the data item (possibly based on a previous read), then T1 (based on its earlier read value) updates the data item and commits. In terms of histories, this is:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

The problem, as illustrated in history H4, is that even if T2 commits, T2's update will be lost.

H4: r1[x=100] r2[x=100] w2[x=120] c2 w1[x=130] c1

Dirty Write との違いは Lost Update の定義に r1[x] がいることです。これにより、P4は Serializable になりません。

r1[x] は w2[x] の前に実行されています。当然、T2のupdateはlostすることになります。
H4の例でみると、T1は x+30 、T2は x+20 なので、T1, T2 が順に実行されれば x=150 になるはずですが、x=130 となってしまいました。

今回の課題のスケジュールに r1[x] に相当する操作はなく、Lost Update ではないとわかります。

Dirty Write と Lost Update の比較

Dirty Write と Lost Update の定義を再掲します。
P0: w1[x]...w2[x]...(c1 or a1) (Dirty Write)
P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

Dirty Write の場合、仮に先行する w1[x] がなかったとしても(T1のUpdateがLostしたとしても)、DBの最終状態には何も影響を及ぼしません。
ですが、Lost Update の場合、T2->T1 で実行された場合と、P4のorderで実行された場合とでDBの最終状態に違いが現れます。それはT1が参照すべきT2のupdateがLostしたからです。

この違いは r-w が conflict の肝だ、という話につながっていくように思うのですが、さて…?

DBTS2018「今後のDBのトランザクション処理のあり方について徹底討議する」パネラー参加記録

始めに

db tech showcase Tokyo 2018 (db tech showcase Tokyo 2018 | db tech showcase)
今後のDBのトランザクション処理のあり方について徹底討議する ~"InvisibleWriteRule: トランザクションの書込み最適化" を中心に
にパネラーとして参加してきました。その記録を残します。

きっかけ

きっかけは神林さんからの Twitter DM でした。それまでは私から神林さんを一方的に存じ上げているだけでしたので、神林さんから DM が来た時には何事かと、以前にまとめた記事(急がば回れ、選ぶなら近道 TX記事 読解メモ - ぱと隊長日誌)のことで何かお叱りを受けるのではないかと、ビクビクしていました。

実際には今回の討論会に参加しないか、とのお誘いでした。それにしても人違いではないかと心配していたのですが、人違いではないし、トランザクションに興味があって勉強していれば十分とのお言葉があり、せっかくのチャンスに乗ろうと決意しました。

伝えたかったこと

今回のパネルで話せたこと、話せなかったことも含め、私の意見をまとめておきます。
引用及びリンクは参考にした資料や記事などです。

InvisibleWriteRule (IWR) の説明で用いられたスライドです(ただし、多少中身の異なる点があります)。

IWR はスライドで補足されている通り、UPDATEでしか有効とならない。だが、競合の発生率が低い場合でも性能が向上している。なので、適したワークロードの範囲は広いとみている。

スライドには Update-Heavy な例として Database for Sensor Network が挙げられている。これが適用される分野としてIoTが思い浮かぶ。センサーのデータは残す(INSERT)ケースが多いのではと思っていたが、実例を見ていると捨てている(UPDATE)ケースもある模様。こういうアプリケーションであれば向いているのではないか。
また、神林さんが触れていたようにステータス管理等ではとてもマッチするはず。

また1工場あたり1日のデータ量がペタバイトクラスになるデータのほとんどは蓄積していない。インテルはデータ分析をエッジ部で実行し、そのPC が製造装置を監視し、装置の正常稼働状態が維持できていることを確保している。すべてが正常と判断されれば、データ蓄積は行わない。ただ統計的工程管理(SPC)の目的用途としてのみこれに要するデータを残している。

工場への機械学習・AI 導入の9ステップ-インテルIoT ワークショップ報告(2) | ARC Advisory Group

one-shot request はストアドプロシージャをイメージするとよい。リクエストをまとめて投げて、レスポンスをまとめて受け取る。これまでのインタラクティブな(SELECTを投げてその結果に応じてUPDATEするような)実装が変わってくるはず。ただ、変化を受け入れない現場が想像以上に多い中で受け入れられるか?

トランザクション分離レベルを開発者が意識し、それを適切に扱うのはやはり困難ではないか。Serializable がデフォルトで、それでもパフォーマンスが出るような時代が来てほしい。
セッションの最後に中園さんがそういう未来を目指しているとお話ししてくれたことは本当にうれしい。

  • 「世の中一般にはserializableは遅いので使うな」という言い方がされることがあるが、DB屋的にはこれは普通に屈辱(のはず。)
    • lockレスで、そのまま放り込めば、concurrentなままserializableなスケジュールを組みあげるというのが、最適な実装。
A critique of ansi sql isolation levels 解説公開用

現実的なアプリケーションのパフォーマンスをどう測定すべきか?今のメジャーなベンチマークが現実に即していないとするならば、何を持ってすれば測れるのか?ベンチマーク最適な研究が進んでしまったりしないか?
ベンチマークスペシャル - nikezono

理論の段階からロングトランザクションへの考慮をしてほしい。アボートした時のペナルティが大きすぎる。かといって、アプリが合わせに行く、例えばトランザクションの粒度を小さくして、自力でリカバリ処理を行うというやり方は本末転倒だと思う。

Abort rate は数字の大小よりその中身が重要だと思う。ロングトランザクションを犠牲にしてショートトランザクションをバンバン流せば Abort rate は見かけ上よくなる。でも、それが評価として正しいとは思えない。
Fariness の研究が進むことに期待したい。

我々のような開発者やDBAも、DB研究がどのような方向に進み、5年後か10年後かそれ以上先かもしれないが、どんな形で商用化されるかをイメージし、そこに備えておく必要がある。

参加してどうだったか

今回求められていたポジションは現場で活躍されているDBAの皆様と同じ目線でコメントしてほしいとのことでした。とはいえ、理論について議論しているところに現場の話を持ってくるというのは中々に難しく、前半は苦しいコメントとなってしまいました。
後半は若干開き直り、多少テーマを外れても好きにしゃべることにしました。「(理論の)現状の問題点」を「現場の現状の問題点」に言い換えてしゃべったときはさすがにまずいかと冷や汗かいていましたが、隣にいた神林さんがウンウンとうなずきつつ、それでいい、とつぶやいてくださり、ホッとしました。

現場とつなぐ、という意味で初見ではわかりにくいところを補足できればよかったな、というのが反省点です。例えば、 R∞設定 とか one-shot request とか、いきなり言われてもよくわからないですよね。間違った解説をしても周囲がプロなので速攻訂正されたでしょうし、やってみてもよかったなと思っています。

慣れてきた後半はリスナーの方の様子を見ながら話していたのですが、うなずきながら聞いてくれる方のありがたさをひしひしと感じました。分かってくれる方もいるんだ、と思うだけで不安とか緊張がかなり解消されました。

スピーカーの皆さんのすごさ

論文の読み解き方

私のレベルでも字面を追って理解した気にはなれます。ですが、スピーカーの皆さんのレベルになると、その記述に込められた意味まで的確にくみ取っていました。その具体例が神林さんのブログ(急がば回れ、選ぶなら近道)なり発表に現れています。

関連研究の知識の広さと深さ

手法の議論をする際にあれと一緒だよね、でお互いに伝わっていました。

そして、知らないことは知らないといえること、それに対して教え合う姿勢があることも素敵でした。誰もググれなんていいません。その打ち合わせに臨む以上、準備はしてきているはずだし、それで知らないのであれば教え合おう、という雰囲気があったように感じました。

課題への取り組み方

事前打ち合わせを2回実施しましたが、1回目での課題をそのまま次回へ持ち越す事はありえませんでした。それまでに課題に対して調査と検討を行い、自分なりの答えを持って次回に臨まれていました。
当たり前のことかもしれませんが、中々できないことではないかと。

最後に

お誘いを受けた時は自分の力量不足に自覚があり、迷惑をかけるのではないかと悩みましたが、今となっては参加できて本当に良かったです。

特によかったのが、トランザクションに興味を持つ方のコミュニティに参加できたということです。今まではわからないことを延々と悩んでいましたが、考え抜いてもわからなかったことを相談できる、というのは大変ありがたいことでした。

参加するにあたり、自分の知識・経験不足を言い訳にしないことを決めていました。それは甘えでしかありません。それよりも、セッションが終わるその瞬間まで、自分がやれる精一杯のことをやるべきだと考えていました。それを貫き通せたことは自信にもつながりました。

今後も、研究と実務の間の橋渡し役として、微力ながら貢献させていただきます。

トランザクションをもっと深く知るための資料集

Level 0

トランザクションを深く学ぶための準備フェーズです。

まずは自分の得意なRDBのマニュアルもしくは本から、以下に関する章を読んでみてください。

現在のプロダクトにどのような技術が用いられているかを知ったうえで学ぶことで、その背景にはどんな理論があるのか、また研究レベルでどんな進化を遂げているのかを実感して学ぶことができます。そして、将来のDBの姿が見えてくるはずです。

Level 1

トランザクション理論への第一歩です。

この先へ進むにあたり注意していただきたいのが、ひとまず自分の知っている Serializable を忘れてください。一般的なRDBで設定可能なトランザクション分離レベルである SERIALIZABLE にとらわれると、実際の振る舞いと学術的な説明の差異に混乱するかもしれません。まずは資料の説明を素直に受け入れ、先に進むことで気づきがあると思います。

一人トランザクション技術 Advent Calendar 2016

一人トランザクション技術 Advent Calendar 2016 - Qiita

kumagiさん(@kumagi)による、とても分かりやすい記事集です。基礎的なとこから比較的最近の研究成果まで、一通り学ぶことができます。
kumagiさんの資料全般に言えることですが、難しいことをわかりやすく、時に図示して解説してくれます。

Level 2

トランザクションに関する用語と最近の研究成果のサマリを学びます。

トランザクションをSerializableにする4つの方法

kumagiさんの資料です。
「2015年12月18日に行われたビッグデータ基盤勉強会で発表する際に使った資料」とのこと。

Serializable で無いときに起こる Anomaly を取り上げ、それをどのように解決するかを解説しています。

この資料の「Serializableとは?」というスライドの内容に違和感を覚えるかも知れませんが、一旦受け止めて先に進んでみることをお勧めします。

キーワード:Serializable, Anomaly, 2PL, Silo

トランザクションの設計と進化

kumagiさんの資料です。
「2016年7月27日 Database Lounge Tokyoで話した内容」とのこと。

従来のリカバリ技法の前提にはメモリ容量 << ディスク容量がありました。ですが、時代は変わり、メモリ容量が大きくなったことで In-Memory DB が登場し、そのリカバリ技法も変わったことを解説しています。

キーワード:リカバリ, In-Memory DB, Silo

トランザクション入門

kumagiさんの資料です。

トランザクションの並行処理に着目して解説しています。

キーワード:Linearizability, 2PL

並行実行制御の最適化手法

中園さん(@nikezono)の資料です。

並行実行制御の性能向上手法についての概要を解説しています。

キーワード:2PL, Early Lock Release, Group Commit, Speculative Read

Level 3

ここからは覚悟が必要になります。学ぶ覚悟、そしてWeikum本(TX本)を買う覚悟です。
Serializable とは何なのか、ということを突き詰めていくことになります。

Transactional Information Systems: Theory, Algorithms, and the Practice of Concurrency Control and Recovery

通称:TX本、Weikum本

この本は技術書の中でも値段の高い部類です。Kindle版ですら1万円を超えます。
ですが、この先のレベルを学ぶのであれば、購入することをお勧めします。この先に出てくる資料では度々Weikum本の用語や記法が使われます。また、それらはググってもほとんど出てきません。用語がわからず延々とググって時間を無駄にするより(私のことです…)、購入して手元に置きながら学ぶことをお勧めします。

ハードカバー版とKindle版がありますが、ハードカバー版のほうが使い勝手がよさそうです(私はKindle版を購入していました)。Kindle版は検索が楽なのですが、頭から読み進める際は行きつ戻りつしながら読むことになるので、ハードカバー版のほうが読み進めやすそうです。

Concurrency Control and Recovery in Database Systems

通称:CC本

トランザクション理論を議論する際はTX本をベースとすることが多いのですが、神林さんのブログ(急がば回れ、選ぶなら近道)ではCC本を参照することもあります。

ハードカバー版をAmazonで購入可能ですが、著者の一人である Phil Bernstein のプロフィールページ(Microsoftサイト内)からPDF版を入手することが可能です。
Phil Bernstein at Microsoft Research

トランザクションの並行実行制御 rev.2

サイボウズ・ラボの星野さん(@starpoz)によるトランザクションの解説スライドです。

Deadlockを回避する手法についてスライドを割いて解説しています。

キーワード:Serializability, 2PL, Deadlock

中園さんの Scrapbox

Transactional Information Systems - nikezono

Weikum本を読み進めるための心強いガイドです。kumagiさんと同じく、難しいことをとてもわかりやすくかみ砕いて説明しています。

上記リンクから辿れるページ以外にも参考になる用語解説などがありますので、ぜひ参照してみてください。

Riccardo Rosati 教授の授業資料

Data Management for Data Science - Sapienza Universita' di Roma

Data Management for Data Science の授業資料が公開されています。英語です。

このうち、"DBMS transaction management and recovery management"というリンク(記事公開時点)の資料がトランザクションを知るうえで参考になります。Weikum本が入手できない場合は代わりに読むことをお勧めします。ただし、(記事公開時点の資料においては)FSR, VSR の説明が無いなど物足りない点があり、Weikum本の代替にはなりません。

[xSIG 2018]InvisibleWriteRule: Extended write protocol for 1VCC

中園さんらによる InvisibleWriteRule の xSIG2018 発表資料です。表紙は日本語ですが、中身は英語です。

InvisibleWrite は読まれることのない書き込み処理をスキップすることで性能を向上させる手法です。

キーワード:OCC, Serializable, Bloom Filter

Level 4

最近の研究成果を学びます。これらの研究成果が商用プロダクトに適用されるまでに何年かかるか(そもそも商用に適用されるのか)わかりませんが、先を見通したい方はぜひチャンレンジしてください。そして、私に教えてください…。

このレベルはほぼ神林さん(@okachimachiorz1)の独壇場です。

急がば回れ、選ぶなら近道

急がば回れ、選ぶなら近道

神林さんのブログです。トランザクションの論文を解説した記事を何本も掲載しています。
Weikum本と論文を片手に読まないとチンプンカンプンな、ついてこれる奴だけついてこいのスタイルです。でも、それが面白いです。

ブログはトランザクション以外の記事もあり、特にまとまってはいません。以前に私がトランザクション関連記事をまとめていますので、リンク集代わりにお使いください(最近の分はまだ反映できていません)。
急がば回れ、選ぶなら近道 TX記事 読解メモ - ぱと隊長日誌

A Critique of ANSI SQL Isolation Levels 再読

神林さんの発表資料です。

Isolation Levels とは何なのか。それはどう定義すべきものなのか。ということを提案した論文(A Critique of ANSI SQL Isolation Levels)について解説しています。

キーワード:Isolation Levels, 2PL, SI

次世代DB / 分散OLTP(MVCC系)を可能な限り全力で解説

db tech showcase Tokyo 2017 での神林さんの発表資料です。

Cicada の解説がメインとなります。

以前に聴講メモをまとめましたので、併せて参照ください。
DBTS2017「次世代DB / 分散OLTP(MVCC系)を可能な限り全力で解説」聴講メモ - ぱと隊長日誌

キーワード:OCC, MVCC, Serialization, Cicada, WBL

更新情報

2019/01/05

"Transactional Information Systems: Theory, Algorithms, and the Practice of Concurrency Control and Recovery" の通称について追記しました。

"Concurrency Control and Recovery in Database Systems" の紹介を追記しました。