技術とか戦略とか

SIerで証券レガシーシステムを8年いじってからSESに転職した普通の文系SEによる技術ブログ。

情報処理技術者試験対策「排他制御・デッドロック」

この記事では、情報処理技術者試験で問われる排他制御デッドロックについて、基礎的なことを書いていきます。
 
排他制御デッドロックを理解する前に、トランザクションについて理解する必要があります。
トランザクションとは、複数の処理をひとまとまりにしたものです。
例えば、出庫時に在庫数を更新するトランザクションは、下記の処理をひとまとまりにすることで実現できます。
・在庫テーブルから在庫量を取得する
・取得した在庫量から出庫した分を差し引く
・差し引いた在庫量を在庫テーブルに反映させる
 
このトランザクションを実行する上で注意が必要なのは、トランザクション実行中に在庫テーブルが更新されないことを保証する必要があることです。
もし、在庫量を取得した後に在庫テーブルが更新されてしまった場合、トランザクションで算出した在庫量でその更新を上書きしてしまいます。
それを防ぐために、トランザクション中で在庫テーブルにロック(排他制御)をかけ、トランザクション実行中に在庫テーブルが更新されないようにします。

f:id:akira2kun:20210501002637j:plain

 
このように更新結果の不整合を防げるのがロックなのですが、デメリットもあります。
複数のトランザクションがロックをかけた場合、複数のトランザクションがお互いにロック待ちの状態となり、トランザクションを終了できないのでロックを解除することもできず、(強制的にトランザクションを終了させるまでの間)永久にトランザクションが終了しなくなることがあります。
このような現象を、デッドロックと呼びます。

f:id:akira2kun:20210501002707j:plain
 
デッドロックを防ぐための代表的な手段として、トランザクションの間でロックする順番を統一するという手段があります。
この手段を用いることで、他のトランザクションが中途半端に進んで中途半端にロックをかけることがなくなるので、デッドロックを防ぐことができるようになります。

f:id:akira2kun:20210501002723j:plain
 
----------------------
 
情報処理技術者試験に関する記事の目次
https://1drv.ms/b/s!AivF3bzWXOzuhG1Xk5hscKYqkLkM