- - PR -
ロックの仕方について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-05-23 15:58
いつもお世話になってます。どっちの丸ちゃんです。
環境:Win2000 , Tomcat4.1.24 , PowerGres でJSPのページを作成しています。 行ロックが行えるようにしたいのですが、どのようにしたらいいか分かりません。 "for update nowait"のようにしたいのですが良い方法ありますか? ロックされていることが分かればいいのですが・・・ ヒントになるようなことでも構いません。 よろしくお願いします。 _________________ | ||||
|
投稿日時: 2003-05-23 16:23
DBの行ロックのことですよね?
私が知っている方法は、1つのテーブルにアクセスするクラスをsingletonにして、テーブルロックを保証するということ位なのですが、行ロックに関してはスキル不足なため存じておりません、解答になってませんが、なにかヒントになれば幸いです。 | ||||
|
投稿日時: 2003-05-23 17:39
PostgreSQLがアーキテクチャとして行ロックをサポートしているかは存じませんが、
DBレベルのロックを行うのであれば select hoge from table where condition for update; ではないでしょうか? 見当違いだったらごめんなさい。 VMが1つしか存在せず、Javaレベルでロックを行うのであれば ニシトミ さんのおっしゃる 通りですね。 synchronized(行を表すオブジェクト){ //ビジネスロジック } といったイメージでしょうか | ||||
|
投稿日時: 2003-05-25 02:01
ロックされていることが分かれば良い、との事ですが、 示されているような、 〜for update nowait で可能です。 nowaitを指定した場合、ロックされている行に更新系の処理を しようとするとSQLExceptionがスローされます。 nowaitを指定しなければ設定されている時間ウェイトが発生します。 # 少なくとも過去にOracle9.1.1で開発した時はできました。 # 他のDBMS(と言うよりJDBCの実装依存ですかね)ではどうかわかりませんが... | ||||
|
投稿日時: 2003-05-25 18:20
PostgreSQLでは"select ... for update"はサポートされています。
反対に"select ... for update nowait"はサポートされていません。 たしかPowerGresはPostgreSQL7.3.2相当だったはずです。 http://www.postgresql.jp/document/pg732doc/reference/sql-select.html というか、PowerGresは商用製品であり、詳細なマニュアルが添付されている はずですが、評価目的でトライアル版を利用中なのでしょうか? ># 他のDBMS(と言うよりJDBCの実装依存ですかね)ではどうかわかりませんが... 何故、JDBCの実装依存なのでしょう? どう考えてもテーブルの行ロックは DBMS依存です。DBMSでサポートされていなければ、JDBCドライバの実装サイドで はどうにもなりません。 どこから何処までがJDBCの領域で、どこから何処までがDBMSの領域かを きちんと意識的に勉強されたほうがいいですよ。 ># 少なくとも過去にOracle9.1.1で開発した時はできました。 Oracleでできるから、他のDBMSでもそのままできるという思考が何故成立する のか不思議です。OracleとPostgreSQLは別物...。 DBMS毎に実装に差異があり、それぞれに特徴があります。また、SQLの実装 状況にも差異が存在し、DBMSによっては独自のSQL拡張を行っているモノも あります(概ね、SQL92あるいはSQL99に準拠している筈ですが)。 | ||||
|
投稿日時: 2003-05-26 00:47
> 何故、JDBCの実装依存なのでしょう? どう考えてもテーブルの行ロックは
> DBMS依存です。DBMSでサポートされていなければ、JDBCドライバの実装サイドで > はどうにもなりません。 すいません。言葉足らずでした。 言いたかったのはasipさんが言われている通りです。 テーブルの行ロックができるできないはDBMS依存です。当たり前の話ですね。 僕が言いたかったのは、nowait指定時に即SQLExceptionがスローされるかどうか はJDBC依存だろうと言う意味です。 しかし、今になって思えばこれも無責任な発言でした。 正確に言うとOracleでしか試したことが無いのでProstgreSQLでは 僕にはわかりません。「恐らくはJDBC依存」に訂正します。 > どこから何処までがJDBCの領域で、どこから何処までがDBMSの領域かを > きちんと意識的に勉強されたほうがいいですよ。 忠告どうもです。意識はしています。 > Oracleでできるから、他のDBMSでもそのままできるという思考が何故成立する > のか不思議です。OracleとPostgreSQLは別物...。 PostgreSQLでできるとは一言もいってません。 他のDBMSではどうかわからないと書いてあったはずです。 Oracleのことはあくまで「少なくとも」の話です。 Oralceで可能だったと言うだけでも少なくとも問題解決の糸口になるのでは... との思いでレスした次第です。 あと、「何故〜思考がうんぬん」と言う発言は侮辱と受け取りました。 asipさんがどれだけできる人なのか知りませんが、オープンなコミュニティ でそのような発言をするとは大人気ないとしか言いようがないですね。 この一文が無ければ...残念です。 [ メッセージ編集済み 編集者: YOU@IT 編集日時 2003-05-26 00:55 ] | ||||
|
投稿日時: 2003-05-26 07:56
要は他のトランザクションとの更新がぶつかったことを検出したいわけですね?
よく利用されるのはBIGINTとかTIMESTAMPとか適当なカラムを指定しておき、レコードの読み出し時にどっかに保存しておきます。そんでFOR UPDATEとか、更新ロックをとる適当な分離レベルとかにしてフェッチしてその値を照合します。ずれてたら例外をスローすると。ずれてなければ更新時にカラムをインクリメントするとか現在のTIMESTAMPで書き換えるとかします。 | ||||
|
投稿日時: 2003-05-26 09:55
みなさん、たくさんのレスありがとうございます。
PowerGresでは、"〜 for update nowait"はサポートされていないみたいです。 それに近いことが出来ればと思ったのですが・・・ Anthyhimeさんの言うように
のようなやり方でやっていこうと思います。 | ||||
1
