たばりばりスタイル

たばりばりスタイル

バリバリバリ⚡︎

「トラブル知らずのシステム設計エラー制御・排他制御編」の排他制御編を読んだ

ここ最近、参画先でバッチ作成タスクにアサインされました。ここで作成するバッチはサービス稼働中に実行する必要があり、データの整合性を考慮する必要がありました。
このタスクを通して、データの整合性を考慮する際の知識が不足していると感じたため、「トラブル知らずのシステム設計エラー制御・排他制御編」とういう本を買って読んでみました。こちらエラー制御・排他制御編でふたつのテーマがあるのですが、今回は排他制御編のみ読んでいます。

感想

実際にありそうな様々な事例に対して、新人エンジニアが立ち向かうストーリー方式で、図をガンガン使って排他制御の設計について解説してくれます。

排他制御って誰から習うの、どうやって学習できるの?って思ってる方には入門として良い書籍だと思いました。

特に後半のオンライン処理とバッチ処理での考慮点などは、今回アサインされたタスクの考慮点とすごく近くて参考にしました。

雑なメモ

排他制御とは、共有資源に対して複数トランザクションから操作がある場合、同時アクセスによって起こる不整合を防ぐため、あるトランザクションがアクセスしている場合、他トランザクションからはアクセスできないように、並列に処理させる制御のこと

楽観ロック
  • 他者による更新はめったに起きない前提のロック
  • 業務トランザクション終了時(更新時)にロックを検知させる
  • SELECT FOR UPDATE を使い、ロックキーを比較、問題なれば UPDATE。別トランザクションは UPDATE 完了まで Wait になるので、上書きし合うことはない
  • 同一業務を複数人で実施しない、更新の競合発生してもやり直しが容易な場合におすすめ

ロックキー: データ更新されたか否かを判断するために利用する情報。よく利用されるのは、バージョン、タイムスタンプ、全列データの比較。
ここではバージョンをおすすめ。特徴は確実性が高い、新たなカラムが必要、バージョン更新を忘れないようにしなければいけない

悲観ロック
  • 他者による更新が頻繁に起きうる前提
  • 業務トランザクション開始時(取得時)にロックを検知させる
  • SELECT FOR UPDATE でロック状態を確認し、非ロック状態なら自身の情報でロック状態に変更。業務トランザクションを行う。ロック状態なら排他エラー。別トランザクションはロック状態 UPDATE 完了まで Wait になるので、上書きし合うことはない
  • 同一業務を複数人で実施する、更新の競合発生するとやり直しが難しい場合におすすめ

最後

データの整合性について考える際には、再度読み直したくなる本でした。買ってすごく満足です。