ここから本文です

postgresqlで、通常のselect文を発行するとテーブルロックがかかってしまうと思う...

このエントリーをはてなブックマークに追加

質問者

zgmf_x2000_goufさん

2014/3/623:35:16

postgresqlで、通常のselect文を発行するとテーブルロックがかかってしまうと思うのですが、回避するにはどうすればよいでしょうか?

閲覧数:
416
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

アップロード写真

カテゴリマスター

2014/3/1322:48:00

回避することはできません

この質問は投票によってベストアンサーに選ばれました!

  • このエントリーをはてなブックマークに追加
簡単にみんなで作るショート動画アプリ Yahoo!Chocotle for Android(無料)
ベストアンサー以外の回答
1〜2件/2件中
並び替え:回答日時の
新しい順
|古い順

アップロード写真

カテゴリマスター

nanco_nannanさん

2014/3/1310:53:12

結局 テーブルロックは、書き込み途中の不正データを読み込まないために必須なんです。
もし、ロックをかけなかったら、書いてる途中の変なデータが出てきてしまいます。
select のロックは、書き込みを禁止するロックであって、別の人が読むのには障害になりません。
回避という行為がそもそも、意味がないのです。
しかし、暗黙的なロックを繰り返すと、デッドロックの危険性が出てきます。
複雑なことをやるときは、デッドロックを回避するためにも、自分でちゃんと設計して明示的にロックをかけましょう。

アップロード写真

カテゴリマスター

tumura999さん

編集あり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で書き込みがロックされないことは経験しているでしょうに。

Q&Aをキーワードで検索:

PR
Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

お得情報

ソフティモから洗顔フォーム新発売!
簡単なアンケートに答えると抽選で
現品または割引クーポンをプレゼント!

その他のキャンペーン

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する