2テーブルのレコードロックはできない?
データベースにPostgreSQL使ったシステムを作成していますが、登録者のテーブルと登録内容詳細のテーブルの2テーブルをレコードロックしないと、同時に処理した場合、同じ登録者番号が発番されたり、登録数カウントが正しくなくなる可能性に気がつきました。
photo credit: isriya via photopin cc
2テーブルともレコードロックすればいいやと、以前調べた方法を反映しました。
PostgreSQLでレコードロックをして更新する方法 - ソフトウェア開発者の日常
2テーブル目はロックされない?
1テーブル目でロックによる排他が発生する条件でテストをしたところ、予定通りレコードロックされて、同時に処理しても最初に書いた現象は発生しませんでした。2テーブル目でロックによる排他が発生する条件でテストをしたところ、予定通りにならず、同時に処理すると最初に書いた現象が発生しました。
別のテーブルをロックして代用
テーブルロックで2テーブルともロックをしてしまえば済む話ですが、テーブルを共有する他のシステムへの影響が出てきます。考えた結果、登録処理時に更新をしないけれど必ずレコードはあって、レコードロックに使える別のテーブルが存在するので、このテーブルをレコードロックすることにしました。
再度テストしたところ、同時に処理しても排他されて、最初に書いた現象は発生しませんでした。
代替案で対応できたので目的を果たすことができました。
2テーブルロックの必要がなくても、今回の方法の方が変更が少なく済むので、流用する予定です。