質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

0回答

1858閲覧

Postgresqlで行レベルの排他ロックをかけることは可能?

marutto

総合スコア32

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/12/16 12:35

編集2020/12/16 12:41

タイトルの通り、行レベルの悲観的排他ロックをかけることは可能なのか を質問させていただきます。

長くなってしまいますが、以下、この質問をしようと思った経緯について書かせてもらいます。

現在、アプリケーションとバッチ処理で情報の整合性を保つためにロック処理を入れるタスクに取り組んでいます。

当初は設計者によって以下のような方針で調査・実装をするように決まりました。

アプリ側がキャンセル処理をしている最中に、バッチ側がキャンセル前の情報を元に処理を進めてしまう。

よって、アプリケーション側が特定の行を更新している間に悲観ロック(悲観的排他制御)をかける。
これにより、バッチ側はアプリケーションで更新中の行を参照(SELECT)できないようになる。
ロックが解放された後の行にはキャンセルした情報があるため、参照しても情報がヒットせず、処理が進まなくなる。

ただ、私自身が開発担当者としてロックの方法を調べたところ、下記の点が分かりました。

・Postgresqlには行レベルのロックでは参照を禁止するロックがない
Postgresqlのリファレンスを調べたところ、行ロックでSELECTを禁止するロック処理についての記述がありませんでした。

また、ロックについて調査した限りでは、行ロックはFOR UPDATEを使うのが一般的という情報もありました。
排他制御(楽観ロック・悲観ロック)の基礎

加えて、仮に行ロックで悲観的排他制御を行うとすると、更新するタイミングで同じグループに
属するユーザーが情報を参照するケースでもロック解除待ちが発生してしまいます。

このことから、現在は下記のような実装にしようと考えてます。
・アプリケーション側ではFOR UPDATE付きのSELECT文を使って情報を取得・更新をかける
・バッチ側でも同じくFOR UPDATE付きのSELECT文を使って情報を取得することで、アプリケーション側のロック解放を待ち、更新(キャンセル)後の値を取得する(SQLにキャンセルフラグがついていない行を取得する条件がついているので、処理が進まない)

実装は上記の方法でメドがたったのですが、
ロックについて気になったため、冒頭に書いたような質問をさせてもらいました。

ご存知のかたがいらっしゃいましたら教えていただけるとありがたいです!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問