
PostgreSQL8.2とJavaを使ったWebアプリケーションを構築しています。
pgAdminでサーバー状態>ロック で参照してみたところ、AccessShareLockというのが大量に発生していました。
マニュアルを参照してみたところ、
>AccessShareLock を除き,トランザクション内で獲得されたすべての ロックモードは,そのトランザクション実行の間維持されます.
とあり、つまりAccessShareLockはトランザクションの間でも維持されないということだと思うのですが、どうも解放されてはいないようです。
これは通常の(つまり、更新しない)select文を発行したときに発生するロックだと思うのですが、いろいろ調べても、どうもこのAccessShareLockというのをどのくらい気にしたらいいのかがわかりません。
このロックが残っていると、どのようなときに困るでしょうか。
また、解放するためには通常のselectのあとでもcommit(またはrollback)をする必要があるということになるでしょうか。その際にはcommitとrollback、どちらがいいということはあるでしょうか。
ご存じのかたがいらっしゃいましたらご教示いただければと思います。よろしくお願いいたします。

No.3ベストアンサー
- 回答日時:
回答番号: No.2 に対して訂正があります。
> 手元の psql で確認した限りでは、トランザクション内で SELECT を実
> 行してコミットしていない状態だと、SELECT の対象となっているテーブ
> ルの他にいくつかのシステムカタログに対しても Access Share Lock が
> 取得されたままでした。
と書きましたが、これは psql 内でテーブル名などの補完を行ったためで
した。
いずれにしてもトランザクション内で SELECT を実行してコミットせずに
放置しているのであれば、対象となるテーブルと、そのテーブルに定義さ
れたインデックスにも Access Share Lock が取得されたままとなるので、
トランザクションをコミットするようにしてみてください。
トランザクション内で更新していなければロールバックでも構いません。
ありがとうございました! 締め切らずに待っていたがありました。。(;-;)
なるほどなるほど、やっぱりcommitかrollbackしないといけないのですね。これが残っていると、テストの時などちょっとしたテーブルの修正などができなくてAPサーバーごと停止しないといけないので困っていたのです。
修正箇所が膨大なのでまだ試しておりませんが、きっとこれでうまくいくはずです!
どうもありがとうございました!!
No.2
- 回答日時:
添付の画像が小さくて気付かなかったのですが (拡大できるのかな?)、クエリーが「<Idle> in transaction」になっているようです。
「<Idle> in transaction」というのはトランザクションが開始されて次の SQL が実行されるのを待っている状態です。
確か JDBC ではデフォルトで自動的にトランザクションが開始され、また、DBCP などのコネクションプールを使っているとデータベースへの接続が保持されたままとなります。
手元の psql で確認した限りでは、トランザクション内で SELECT を実行してコミットしていない状態だと、SELECT の対象となっているテーブルの他にいくつかのシステムカタログに対しても Access Share Lock が取得されたままでした。
従って、Statement オブジェクトの executeQuery メソッドで SELECT を実行した後に Connection オブジェクトの commit メソッドでトランザクションをコミットしてあげれば、大量に Access Share Lock が取得されている状況は解消されるのではないかと思います。
No.1
- 回答日時:
ご質問にあるように ACCESS SHARE LOCK は通常の SELECT (FOR UPDATE などを指定していない) を実行した場合に暗黙的に取得されるロックのモードです。
従って、ACCESS SHARE LOCK が長時間確保されたままの状態というのは、SELECT の実行に時間がかかっているということです。ACCESS SHARE LOCK はテーブルロックの中では最も弱いロックなので、残っていたとしてもそれほど問題はありません。問題があるとすれば ACCESS SHARE LOCK と競合する ACCESS EXCLUSIVE を取得する処理、ALTER TABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER、VACUUM FULL の実行が待たされることくらいです。
あと、ACCESS SHARE LOCK を開放する方法についてですが、前述のように通常の SELECT を取得されるロックなので、COMMIT や ROLLBACK では対応できません (COMMIT や ROLLBACK が実行されるのは SELECT の実行が完了した後なので)。もし、強制的に ACCESS SHARE LOCK を開放したい場合には SELECT の実行をキャンセルしかありません。
参考URL:http://www.postgresql.jp/document/pg826doc/html/ …
ご回答どうもありがとうございました。
実際に、select文を発行して結果セットを取得し終わってから放置してみたのですが、20分くらいたってもロックは解放されませんでした。
そして、次のselect文を発行すると、前回のロックが全て解放され、新たなロックが生成され、それがずっと解放されない……という繰り返しになっています。
> 従って、ACCESS SHARE LOCK が長時間確保されたままの状態というのは、SELECT の実行に時間がかかっているということです
とのことですが、これはつまり、「selectの終了とはいつのことを指すのか」ということにもつながってくるかと思うのですが、、、
(カテ違いになってしまうかもしれませんが)JDBCで考えると、「selectの終了」とはいつかを考えたとき、思い当たるのは
・executeQuery()メソッドの処理が終わったとき
・結果セットオブジェクト(ResultSet)をクローズしたとき
・ステートメントをクローズしたとき
などなどがあるかと思うのですが、実際にはどういうタイミングかご存じでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- docomo(ドコモ) SIMロック、またはSIMロック解除の仕組みをおしえてください。 5 2022/04/25 10:57
- 格安スマホ・SIMフリースマホ SIMカードのロックについて 1 2022/03/29 15:02
- Android(アンドロイド) Googleのファミリーリンクの危険性に気付いてしまったのですが、皆さんの感想を教えてください! 2 2023/05/09 10:01
- その他(Microsoft Office) OneDrive Personalについて 1 2022/08/02 18:25
- 運転免許・教習所 運転免許証の暗証番号を勘違いで間違えてしまい、ロックされてしまいました。正しい暗証番号はもう分かって 1 2023/01/30 17:32
- Android(アンドロイド) auのAndroid端末のSIMカードがロックされてしまいました。 6 2022/08/22 20:31
- iPad ワイモバイルのシンプルMプランのシェアプランのSIMが、ipadに使える設定方法を教えてください。 2 2023/08/16 11:34
- iPhone(アイフォーン) iPhone セキュリティロック解除 2 2023/01/26 18:59
- Android(アンドロイド) スマホ、ロック機能なんて要らない。何とかまるきり動作させないようにできないか? 3 2022/05/19 18:49
- 格安スマホ・SIMフリースマホ Y!モバイル転出後のSIMロック解除後 1 2023/01/09 20:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
Oracleの排他制御について教え...
-
UPDATE文で発生するデッドロッ...
-
SQL Server のデータをCSVファ...
-
商品コード番号を入力すると商...
-
クエリのキャンセルがいつにな...
-
ユニオンクエリの結果をテーブ...
-
ACCESS2007 フォーム 「バリア...
-
ストアドでXMLファイルを読込む...
-
片方のテーブルにないデータを...
-
ADOでSeekメッソッドが使えませ...
-
ACCESSで複数テーブルを結合し...
-
「マスタ」と「テーブル」の違...
-
ビューにインデックスを設定で...
-
sqlserverで対象のレコードを削...
-
ASPからSQLサーバーへ接...
-
excel テーブル
-
下記のsqlで取得されるレコード...
-
ACCESS 一番最新の日付の金額...
-
ACCESSのBookmarkプロパティの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SELECT時の行ロックの必要性に...
-
SQLServer Insertが遅い
-
accessのロック
-
Oracleの排他制御について教え...
-
AccessShareLock はどの程度気...
-
SELECT文でタイムアウト...
-
UPDATE文で発生するデッドロッ...
-
INSERTにおいてロック処理は必要か
-
DB2でSelectした時(rollback,c...
-
max+1で初番する場合 for updat...
-
排他ロックしたレコードが、別...
-
更新ロックとデッドロック
-
パススルークエリでのロックに...
-
ExcelからAccess2013DBを更新す...
-
同一トランザクションの中でテ...
-
デッドロックが発生します。
-
トランザクション中にSELECTし...
-
同時書き込み
-
SQLServerの明示的なロックの仕...
おすすめ情報