poeaa ch5 2/4

PoEAAデザインパターン勉強メモ

出典: 


Optimistic and Pessimistic Concurrency Control

  • 並列制御

    • 楽観ロック

      • ロックしてねえじゃねえかってやつ

        • 言葉として便利だし、広まってしまったからしゃーない
    • 悲観ロック

      • ロックには2種類

        • 共有ロック

          • R
          • 他の誰にも専有ロックさせない
        • 専有ロック

          • R/W
          • 他の誰にも共有/専有ロックさせない
Optimistic Pessimistic
liveness o x
conflictを… 検出 予防
  • コンフリクトがあまり起きず、起きたとしても重大にならないなら楽観ロックがよい

    • liveness稼げる
    • 実装らく
  • コンフリクトが起きたが最後、マージが困難なら悲観ロック

    • ビジネスロジックのデータとか
  • いずれの解決策を選んでも、問題から真に開放されるわけではない

    • 並列性の問題そのものと同じくらいの新たな問題

Preventing Inconsistent Reads

  • 複数人で変更を加えて、それぞれはテストが通るが、合体すると壊れるやつ

    • 1人がクラスA,もう1人が依存先クラスBをいじるようなケース
  • 本質的にはinconsistent read

    • 依存先クラスBの変更がチェックインされた時点で、クラスAをいじっている人から、変更後のクラスBが見えていない
  • Pessimistic Lock

    • read(shared) lock
    • write(exclusive) lock
    • 誰かがread lockをかけていると、誰もwrite lockできない
    • 誰かがwrite lockをかけていると、誰もいかなる種類のlockもできない
    • コンフリクトを未然に防ぐ
  • Optimistic Lock

    • データにバージョンマーカーを含める

      • タイムスタンプ
      • 連番
    • コンフリクトを検出し、lost updateを防ぐ
  • inconsistent readをなくすには

    • Optimistic Lockと同じことする

      • データの全ビットにマーカーをつける
      • 単に「読んでるだけ」で「使ってはいない」ファイルの仕分けが困難
    • Temporal Reads

      • タイムスタンプやimmutableなラベルをつけてデータを読み出す
      • その時点でのデータを取得できる
      • データソースは全バージョンを持たないといけない
      • CVSなどでは良い
      • DBではいささか高コスト

Deadlocks

  • 悲観ロックでおきるやつ
  • どう対処する

    • 犠牲者をたてる

      • 誰かの変更を捨て、デッドロックを抜け出す
      • ロックにタイムリミットを設けるのもこれ

        • タイムリミットが切れた者が犠牲者
    • ロックの追加取得を禁止する

      • デッドロックは、そもそもロックを追加取得するせいでおきる
      • 最初に必要なロックを全部取得させて未然に防ぐ
    • ロックの取得順を強制する

      • 辞書順とか
      • これも未然に防ぐやつ
  • 複数採用してよい

    • ベルトとサスペンダを両方着用するようなもの
    • だが、安全側に倒したほうが良い
    • デッドロック対策が漏れるよりよい