勉強日記

チラ裏

poeaa ch5 2/4

martinfowler.com


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

  • 悲観ロックでおきるやつ
  • どう対処する
    • 犠牲者をたてる
    • ロックの追加取得を禁止する
      • デッドロックは、そもそもロックを追加取得するせいでおきる
      • 最初に必要なロックを全部取得させて未然に防ぐ
    • ロックの取得順を強制する
      • 辞書順とか
      • これも未然に防ぐやつ
  • 複数採用してよい
    • ベルトとサスペンダを両方着用するようなもの
    • だが、安全側に倒したほうが良い
    • デッドロック対策が漏れるよりよい