- PR -

PostgreSQL8.0でのテーブルロック

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 81
投稿日時: 2006-03-04 12:36
いつもお世話になります。

PostgreSQL8.0でテーブルがロックされるかを実行した
ところ、うまくいかないので質問させて下さい。

psql.exeを起動し、(データベース名:shain)
テーブル(t_login)をロックした後、
テーブル(t_login)にデータを一行挿入しました。
エラーにならずに、更新してしてしまいます。
ご存知の方、宜しくお願いします。

shain=# LOCK TABLE
shain-# t_login
shain-# IN
shain-# exclusive mode
shain-# ;
LOCK TABLE
shain=# INSERT INTO
shain-# t_login
shain-# (
shain(# user_id,
shain(# password,
shain(# shain_id,
shain(# del_flg,
shain(# time_stamp
shain(# )
shain-# VALUES
shain-# (
shain(# 'test_user',
shain(# 'test_password',
shain(# 'test_shainid',
shain(# '0',
shain(# current_timestamp
shain(# )
shain-# ;
INSERT 0 1
shain=#
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-03-05 06:07
まず、ロックとは、他のトランザクションから保護する機構なので、
自分自身のトランザクション内のデータ更新等を行なえなくする事は
できないとおもいます。

ので、下の例がもし、同じ LOCK TABLE を実行した psql 上で
おこなっているのであれば、正しい動作です。


下の例がもし、他の psql 上で行なったログをコピーペーストする都合上、
一つに見えてしまっている場合になぜロックが動作しないか、ですが、
トランザクションを指定してない、という原因が上げられます。

明示的に指定しないかぎり、標準の動作は、一つのSQL実行が一つの
トランザクションと見なされます。
よって、長いSQL実行時に運良く重ならない限り、動作を確認することは
できないでしょう。
よって以下の手順にて明示的にトランザクションの開始を指定するように
してみてください。

shain=# BEGIN ;
BEGIN
shain=# LOCK TABLE t_login IN EXCLUSIVE MODE ;
LOCK TABLE

とした後に別の psql で、該当データベースに接続して、
INSERT 処理をおこなってみてください。
BEGIN を実行した psqlにて、commitないし、rollback を
行なわない限り、INSERT は動作しないはずです。
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 81
投稿日時: 2006-03-05 10:49
せんさん、こんにちわ。

指摘された方法で行った結果、テーブルがロックされうまくいきました。
せんさんの説明も分かりやすく、助かりました。
今回の件、有難う御座いました。
1

スキルアップ/キャリアアップ(JOB@IT)