postgresqlで、通常のselect文を発行するとテーブルロックがかかってしまうと思う...
質問者
2014/3/623:35:16
ベストアンサーに選ばれた回答
2014/3/1322:48:00
この質問は投票によってベストアンサーに選ばれました!
- ベストアンサー以外の回答
- 1〜2件/2件中
- 並び替え:回答日時の
- 新しい順
- |古い順
2014/3/1310:53:12
編集あり2014/3/1311:06:05
postgresでのロックモードは、ほぼテーブルロックです。
行レベルロックとなるのは、SELECT FOR UPDATEを実行したときと、UPDATE/DELETEを発行したときだけです。
この場合、対象行はROW SHAREロックになります。
ただ、そもそもの話としてSELECTによって発行されるACCESS SHAREロックはACCESS EXCLUSIVEロック以外のロックと競合しません。
ACCESS EXCLUSIVEロックはDROP TABLEを伴うようなDDL文で作成されるロックです。このような処理は行ロックだろうとテーブルロックだろうと代わりはないですよね。
つまり通常のSELECTはテーブル単位でロックを行いますが、他の処理と競合しません。
insert文やupdate文などで発行されるROW EXCLUSIVEロックとも競合を起こさないのです(追記型DBの特徴です)。
そういうわけで、確かにpostgresqlはテーブル単位でのロックとなりますが、ロックされることによる実害が通常の行ロックよりも低いため、問題になることはありません。
ロックに関する詳細は、以下を参考下さい。
http://www.postgresql.jp/document/9.3/html/explicit-locking.html
追記:
またいい加減な知識で適当な回答をされている方がいらっしゃいますね。
上のURLにも記述されていますが、postgresは、selectで書き込みをロックしないです。
そもそもpostgresが追記型DBという選択をしたのは、そのためです。
※実務で使っていればselectで書き込みがロックされないことは経験しているでしょうに。