に参加したよー
あらかわさん (@ashigeru) さんによる「図解Global Transaction」
- 赤木しげる呼ばわりされているwww
- 株式会社 グルージェント
- 教育、研究開発(コンパイラ系)、ブログ書き(
- Song of Cloud Blog)
- Slim3 1.0.0 Released
トランザクション処理の考え方
- リソースを一時的に独占できる技術
- 同時に変更して不整合が起こるなどを会費
- すべて成功するか、すべて失敗するか
- 中途半端に終わらない
- アトミック性
- エンティティグループごとのローカルトランザクション
- ACID特性をもつ
- 難点
- 2つ以上のEGをまたいだ操作ができない
- エンティティは作成後EGを変更できない
- EGに含まれるエンティティをすべて独占
- EGを大きくしすぎないようにする
モデリングの例(1)
- チケットをポイントで買うシステム
- ユーザごとにポイントの講座がある
- ポイントを消費してチケットを買える
- ポイントが足りないとチケットが買えない
- チケットには限りがある
モデリングの例(2)
- 全員が全部のチケットを買う可能性がある
- ローカルトランザクションの問題
- EG設計が難しい
- 同時に操作するものを同じうEGに
- EG内のエンティティをすべて独占!!
- 20PPSがmaxじゃないだろうか
- EG設計が難しい
説明の進め方
- うまくいかない実装方法を中心に紹介
- ちゃんと動いている例は後半戦
準備と成功
- ログを保存してから適用
- 途中で失敗してもログから復帰可能
- 適用に失敗してもログから再試行すればいい(task queue)で自動的に再実行
- 準備に失敗したらログを捨てる
- rollback (ジャーナルを書き出すrollforward)
- 準備と適用の間に割り込まれる
- 独占していない状態がある
排他制御の導入
状態の保持
- 2相コミット
- Committedなら絶対に適用する
- CommittedのEGを使う
- ACIDのDurability
- インダウトな状態ができないように、別EGに状態を保持しておく
- CommitedなEGはユニーク制約で切り替える
- Commitedかどうかを書き込む前に30秒ルールなどで落ちた場合に、長時間不明ならAbortedにする
- rollbackする
Slim3 Global Transaction
- 2相コミットは5項目も必要
- ロック取得、ログ作成、コミット、ログ適用、ロック解放
- まともに実装すると2*EGs+1回のトランザクション生じてしまう
参考文献
-
- トランザクション処理(下)
- slideshare.net/ashigeru/ajn4
QA
- read writeでtransaction外なら65msくらいだけど、transaction内では90msくらいかかっちゃう(ひがさん)
ひがさん
ソフトウェアロックの話
- 3つのクラス(slim3)
- グローバルトランザクション
- ロック
- ログ
- ロックのキーとプログラムで使うデータのキーを同時にとる
- パフォーマンスは小さいことの積み重ね(RPCを減らす。一度のRPCで複数のデータを取る)
- ロックのキーを取得できない、及びデータのキーが取得出来る、このキーを取得するまでに変更が入ったらどうなるの?
- Journalの圧縮
- やべえ、わかりきってない・・・コード読んで勉強する