- - PR -
PostgreSQL8.0でのテーブルロック
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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=# |
|
投稿日時: 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 は動作しないはずです。 |
|
投稿日時: 2006-03-05 10:49
せんさん、こんにちわ。
指摘された方法で行った結果、テーブルがロックされうまくいきました。 せんさんの説明も分かりやすく、助かりました。 今回の件、有難う御座いました。 |
1
