こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

LOCK TABLE

登録処理、更新処理、削除処理を行う際に
他ユーザからのアクセスを制限するために
登録、更新、削除処理を行う前にロック処理を行おうと思っています。

その際にテーブルのロックがすでにしている場合や
テーブルのロックに成功した、テーブルのロックに失敗
した場合に戻り値を返すのでしょうか?

お分かりになる方よろしくお願い致します。

一応イメージとして

LOCK TABLE テーブル名称 IN SHARE ROW EXCLUSIVEの処理の後

UPDATE文や、INSERT、削除などを行おうと思っています。


よろしくお願い致します。

投稿日時 - 2008-08-20 00:09:20

QNo.4263743

すぐに回答ほしいです

質問者が選んだベストアンサー

>更新処理全体をストアドプロシージャで呼ぶという事ですが
Oracleのプロシージャで行うと言う事でしょうか?
そうです。PL/SQLでOracleのパッケージかスタンドアロンプロシージャを作成し、パラメータを渡してコールする仕組みです。

PL/SQLの書き方はさすがにここで説明できませんが、Oledbでの使い方については「ストアドプロシージャ Oledb」で検索すると詳しい説明の載っているサイトが上位でヒットすると思います。

投稿日時 - 2008-08-29 14:48:30

お礼

メッセージありがとうございます。
処理的にはPLSQLで更新・ロック処理を
1つの処理として出来る事が理想だったのですが
今回はLOCK TABLEではなく、SELECT FOR UPDATEとして
ロック処理を行うことにしました。

色々とアドバイスありがとうございました。
(PLSQLの書き方についてはコレからも調べてみます)

投稿日時 - 2008-09-20 07:06:01

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

私は通常更新処理全体をストアドにして呼んでしまうので、このような書き方はしないのですが、LOCK TABLEにNOWAIT句をつけなければ、リソースのロックが取得できなかった場合は、ロックが取得できるまで待ち続けます。だからExceptionも発生せず実行中のままになるでしょう。

ただ、Oleなどの場合はCommandTimeOutがありますから、そちらにかかればそこでTimeoutのExceptionが発生しますし、ASPであればIISにもタイムアウト設定がありますから、それにも依存する可能性はあるでしょう。

投稿日時 - 2008-08-23 11:25:17

お礼

メッセージありがとうございます。返事遅くなりました。

更新処理全体をストアドプロシージャで呼ぶという事ですが
Oracleのプロシージャで行うと言う事でしょうか?

自分としては、登録、更新処理の場合に
ロックの処理と、更新・登録を
わざわざ分けるのではなく、プロシージャなどで
ロックと登録または更新が出来ればいいなと思っているのですが
ネットで調べたんですがなかなか載っておらず…

どこかいいサイトがあれば教えて下さい。お願い致します。

投稿日時 - 2008-08-28 22:59:22

ANo.2

ASP.NETでしたか。
エラーはtry ~ catchで捕捉できます(OLEなら、OledbException)。
Lockが有効なのはTransactionが維持されている間だけであるということは留意してください。

投稿日時 - 2008-08-21 04:15:13

お礼

メッセージありがとうございます。
もうひとつお聞きしたいのですが

Try

Catch ex As OledbException
Return False
End Try
Return True

なとどして例外が発生した場合、exとして
例外を受け取り、すぐにFalseを返してしまうのでしょうか?

WAITを指定する事により、待機状態になるとの事ですが
Falseを返さずに待つのでしょうか?

お分かりになればよろしくお願い致します。

投稿日時 - 2008-08-23 09:14:06

ANo.1

処理を何で書くのかはわかりませんが、
LOCK TABLE テーブル名称 IN SHARE ROW EXCLUSIVE MODE NOWAITを実行して、ロックに失敗した場合はエラーになります。
「ORA-00054 リソース・ビジー、NOWAITが指定されていました」
(NOWAITを指定しなければ待ちに入るので返ってきません)
エラートラップが必要かと思います。
成功した場合は特に何も返らないはずです。

投稿日時 - 2008-08-20 11:02:59

お礼

メッセージありがとうございます。

登録や削除を実行する際に他のユーザから
アクセス制限を設けるためにLOCK TABLE 処理を書くつもりでいます。

このORA - 00054は例外としてエラーメッセージが表示する訳ですよね。

エラートラップとはTry ~ Catch ~ Finallyなどでしょうか?
言語がASP.NETなので

Try

Catch ex As Exception
Return False
Finally
Return True
End Try

などとしてうまくいくかわかりませんが、処理を分ける事に
して見ます。

投稿日時 - 2008-08-20 22:32:16

あなたにオススメの質問