ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

2テーブルのレコードロックはできない?

データベースにPostgreSQL使ったシステムを作成していますが、登録者のテーブルと登録内容詳細のテーブルの2テーブルをレコードロックしないと、同時に処理した場合、同じ登録者番号が発番されたり、登録数カウントが正しくなくなる可能性に気がつきました。
f:id:AJYA:20130129220522j:plain
photo credit: isriya via photopin cc

2テーブルともレコードロックすればいいやと、以前調べた方法を反映しました。

PostgreSQLでレコードロックをして更新する方法 - ソフトウェア開発者の日常

2テーブル目はロックされない?

1テーブル目でロックによる排他が発生する条件でテストをしたところ、予定通りレコードロックされて、同時に処理しても最初に書いた現象は発生しませんでした。
2テーブル目でロックによる排他が発生する条件でテストをしたところ、予定通りにならず、同時に処理すると最初に書いた現象が発生しました。

別のテーブルをロックして代用

テーブルロックで2テーブルともロックをしてしまえば済む話ですが、テーブルを共有する他のシステムへの影響が出てきます。
考えた結果、登録処理時に更新をしないけれど必ずレコードはあって、レコードロックに使える別のテーブルが存在するので、このテーブルをレコードロックすることにしました。
再度テストしたところ、同時に処理しても排他されて、最初に書いた現象は発生しませんでした。


代替案で対応できたので目的を果たすことができました。
2テーブルロックの必要がなくても、今回の方法の方が変更が少なく済むので、流用する予定です。