###### tags: `memo` `systems` # LEC 18 Distributed Transactions Slide URL: http://web.mit.edu/6.033/www/lec/s18-partial.pdf ## 前回までの話 - トランザクションは atomicity と isolation を提供する - atomicity を実現する方法のとして以下がある - shadow copies - logging - isolation を実現する方法のとして以下がある - 2PL ## 今回の話 - 今まで単一マシン内でのトランザクションの話だった - 今回は複数マシンに跨るトランザクションの話 ## 複数マシンに跨る場合の問題 - 送金処理を考える - A → B に 100 万円送金 - A と B のデータは別々のサーバにあるとする - 送金は以下の 2 つの部分に分割 - A の口座から 100 万円出金 (A のサーバで実行、コミット) - B の口座に 100 万円入金 (B のサーバで実行、コミット) - もし、ここでコミットされずに、何かしらのエラーで abort されると… - A の口座から 100 万円消えただけになる… ## Two-phase commit (2PC) ### 処理 トランザクションを以下の 2 フェーズに分割する  <small>※講義スライドより引用</small> 1. prepare phase - 各サーバ(worker)はトランザクションをコミットできる状態まで進める - prepare の結果「成功」or「失敗」を coordinator に応答 2. commit phase - prepare phase で全 worker から「成功」が返ってきた場合 - 各 worker に「コミットせよ」というメッセージを送る - 各 worker はコミット完了したら coordinator に「完了」を応答 - prepare phase で 1 つ以上の worker から「失敗」が返ってきた場合 - 各 worker に「ロールバックせよ」というメッセージを送る - 各 worker はロールバック完了したら coordinator に「完了」を応答 ### 障害発生時における対処 #### 1. 任意の phase におけるメッセージ喪失 TCP の再送処理に任せる #### 2. prepare phase 前の障害 - worker に障害 - coordinator は client に abort を返却 - coordinator に障害があった場合はどうするのか?(講義スライドには書いてなかった) - prepare メッセージを worker に送る前だから特になにもする必要はない? #### 3. prepare phase 中の障害 - worker に障害 - (coordinator は timeout によって障害を検知?) - coordinator から全 worker に abort を送る - coordinator から client に abort を送る - coordinator に障害 - 復帰後に全 worker に abort を送ってすべてをやり直す #### 4. commit phase 中の障害 - worker に障害 - abort はできない。障害が発生した worker は prepared state に回復して commit を再実行できなければいけない - 他の worker ではすでに commit が完了してるかもしれないので transaction 全体を abort にできない - 復帰後は coordinator に現在は commit phase かを聞いて、commit phase だったら commit を実行する - coordinator に障害 - 復帰後に全 worker に「コミットせよ」を送信 - すでに commit 済みの worker は何もせずに「完了」だけを応答? ## その他の参考文献 - [https://ja.wikipedia.org/wiki/2相コミット](https://ja.wikipedia.org/wiki/2%E7%9B%B8%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up