SlideShare a Scribd company logo
図解
Global Transaction

appengine ja night #6
あらかわ (@ashigeru)
講演者について
   名前
     あらかわ   (@ashigeru)
   所属
     株式会社グルージェント                       開発部
   普段の業務
     教育(Computer Aided Education)
     研究開発 (コンパイラ系)
     ブログ書き (Song of Cloud Blog)


2010/03/19     appengine ja night #6 - @ashigeru   2
祝 Slim3 1.0.0 Released
   “The main features of Slim3 are as
    follows:
     Global Transactions
     Faster than JDO/JPA
     Fast spin-up
     HOT reloading
     Type safe query”




2010/03/19      appengine ja night #6 - @ashigeru   3
今日の内容
 トランザクションの基礎
 グローバルトランザクションの仕組み
 グローバルトランザクションの制限


   今回のルール
     最適化に関するネタバレなし
     30分ルールでしゃべる
     DSL禁止



2010/03/19    appengine ja night #6 - @ashigeru   4
まずはおさらい

 トランザクションの基礎


2010/03/19   appengine ja night #6 - @ashigeru   5
                                                 5
トランザクション処理の考え方
   リソースを一時的に独占できる技術
     同時に変更して不整合が起こる、などを回避


   すべて成功するか、すべて失敗するか
     中途半端に終わらない
     アトミック性    (ACIDのA)




2010/03/19   appengine ja night #6 - @ashigeru   6
App Engineのトランザクション
   Entity Group (EG) ごとのローカルトラン
    ザクション
     ACID特性を持つ
     楽観的並行性制御

   難点
     2つ以上のEGをまたいだ操作ができない
     エンティティは作成後EGを変更できない
     EGに含まれるエンティティを全て独占


2010/03/19   appengine ja night #6 - @ashigeru   7
モデリングの例 (1)
   チケットをポイントで買うシステム
     ユーザごとにポイントの口座がある
     ポイントを消費してチケットを買える
     ポイントが足りないとチケットを買えない
     チケットは数に限りがある




2010/03/19   appengine ja night #6 - @ashigeru   8
モデリングの例 (2)
   全ての人が全てのチケットを買える
     同時に操作する可能性があれば同一EGへ




2010/03/19   appengine ja night #6 - @ashigeru   9
ローカルトランザクションの問題
   EG設計が難しい
     同時に操作するものを同じEGに
     EG内のエンティティを全て独占




2010/03/19   appengine ja night #6 - @ashigeru   10
トランザクションプロトコルの設計を段階的に

 グローバルトランザクションの
 仕組み

2010/03/19   appengine ja night #6 - @ashigeru   11
                                                  11
グローバルトランザクション
   複数のEGにまたがるトランザクション
     参加するEGを選択して独占




2010/03/19   appengine ja night #6 - @ashigeru   12
説明の進め方
   うまくいかない実装方法を中心に紹介
     ちゃんと動いている例は後半戦で

   今回利用する題材
     Aliceがチケット「ajn6」を購入
     チケット「ajn6」は500ポイント消費
     Aliceの残りポイントが500を切ると買えない
     チケット「ajn6」は数に限りがある

      ※appengine ja night #6 は参加無料です

2010/03/19    appengine ja night #6 - @ashigeru   13
まずはダメな例から

 順次ローカルトランザクション


2010/03/19   appengine ja night #6 - @ashigeru   14
                                                  14
順次ローカルトランザクション (1)
   ローカルトランザクションを順番に実行




2010/03/19   appengine ja night #6 - @ashigeru   15
順次ローカルトランザクション (2)
   チケットが売り切れていた場合
     順番を逆にすると「残高が足らない場合」
     補償トランザクションで払い戻しが必要




2010/03/19   appengine ja night #6 - @ashigeru   16
早めにチケットの残数を確認

 並行ローカルトランザクション


2010/03/19   appengine ja night #6 - @ashigeru   17
                                                  17
並行ローカルトランザクション (1)
   ローカルトランザクションを同時に実行
     独占しながら先に前提条件を確認




2010/03/19   appengine ja night #6 - @ashigeru   18
並行ローカルトランザクション (2)
   コミットが成功するとは限らない
           + 楽観的並行性制御
     30秒ルール
     結局この場合も払い戻しが必要




2010/03/19     appengine ja night #6 - @ashigeru   19
成功するまで繰り返せるように

 準備と適用


2010/03/19   appengine ja night #6 - @ashigeru   20
                                                  20
準備と適用 (1)
   ログを保存してから適用
     途中で失敗してもログから復帰可能




2010/03/19   appengine ja night #6 - @ashigeru   21
準備と適用 (2)
   適用に失敗しても再試行すればいい
     タスクキューを使えば自動的に再試行




2010/03/19   appengine ja night #6 - @ashigeru   22
準備と適用 (3)
   準備に失敗したらログを捨てる
     rollback




2010/03/19       appengine ja night #6 - @ashigeru   23
準備と適用 (4)
   準備と適用の間に割り込まれる
     独占していない状態がある




2010/03/19   appengine ja night #6 - @ashigeru   24
準備したものを排他制御で独占

 排他制御の導入


2010/03/19   appengine ja night #6 - @ashigeru   25
                                                  25
準備と適用の排他制御 (1)
   ソフトウェアで排他制御を行う
     準備から適用までをロックする




2010/03/19   appengine ja night #6 - @ashigeru   26
準備 + ロック取得
   ユニークにロックエンティティを作成
     作成できない場合は他人がロック中                           (排他)




2010/03/19   appengine ja night #6 - @ashigeru          27
適用 + ロック開放
   ユニークにロックを開放しつつ適用処理
     存在しない場合は処理済み                        (べき等)




2010/03/19   appengine ja night #6 - @ashigeru    28
準備と適用の排他制御 (2)
   Commit / Abort ?
     インダウトな状態から復元できない




2010/03/19     appengine ja night #6 - @ashigeru   29
Commit / Abort を区別できるようにする

 状態の保持


2010/03/19   appengine ja night #6 - @ashigeru   30
                                                  30
2相コミット (1)
   トランザクションの状態も記録
     これでほぼ2相コミットと同じ状態




2010/03/19   appengine ja night #6 - @ashigeru   31
2相コミット (2)
   「Committed」なら絶対に適用する
     ACIDのDurabilityを保証




2010/03/19     appengine ja night #6 - @ashigeru   32
2相コミット (2)
   「Aborted」なら絶対に適用しない
     ロックだけ開放




2010/03/19   appengine ja night #6 - @ashigeru   33
2相コミット (3)
   長時間不明なら「Aborted」にする
     ロックの開放漏れを防ぐ




2010/03/19   appengine ja night #6 - @ashigeru   34
Slim3 Global Transaction
   2相コミットプロトコルが基礎
     でも     Local Tx * 5 より明らかに速い!




2010/03/19       appengine ja night #6 - @ashigeru   35
まとめ


2010/03/19   appengine ja night #6 - @ashigeru   36
                                                  36
前半の終了
   2相コミットはそれなりに重い
     ロック取得、ログ作成、コミット、ログ適用、ロッ
      ク開放
     まともに実装すると( 2 * EGs + 1 )回のローカルトラ
      ンザクションが必要
   Slim3 Global Transactionは2相コミットを基礎
     得られる効果は今回の内容と同じ
     しかも妙に速い

   最適化や個々の実装については後半に


2010/03/19    appengine ja night #6 - @ashigeru   37
参考資料
   トランザクション処理(下) – 概念と技法
     ジム     グレイほか, 日経BP社, 2001年
   リレーショナルデータベース入門
     増永     良文, サイエンス社, 2003年
   Transaction Puzzlers (手前味噌)
     http://www.slideshare.net/ashigeru/ajn4




2010/03/19       appengine ja night #6 - @ashigeru   38
後半戦に入る前に

 Question and Discussion


2010/03/19   appengine ja night #6 - @ashigeru   39
                                                  39
時間が余ったら

 グローバルトランザクションの
 制限

2010/03/19   appengine ja night #6 - @ashigeru   40
                                                  40
ローカルトランザクションと併用不可
   通常のltxはgtxのロックを見ない
     Prepare   → Apply のタイミングに割り込める




2010/03/19        appengine ja night #6 - @ashigeru   41
クエリのinconsistent windowが長い
   クエリはgtxのロックを見ない
     Apply中にクラッシュすると、続きはTQで




2010/03/19   appengine ja night #6 - @ashigeru   42
単一EG操作のスループットが悪化
   EGの独占時間が長くなる
     短時間に大量のチケットをさばけない




2010/03/19   appengine ja night #6 - @ashigeru   43

More Related Content

appengine ja night #6 図解Global Transaction