- ベストアンサー
LOCK TABLE
登録処理、更新処理、削除処理を行う際に 他ユーザからのアクセスを制限するために 登録、更新、削除処理を行う前にロック処理を行おうと思っています。 その際にテーブルのロックがすでにしている場合や テーブルのロックに成功した、テーブルのロックに失敗 した場合に戻り値を返すのでしょうか? お分かりになる方よろしくお願い致します。 一応イメージとして LOCK TABLE テーブル名称 IN SHARE ROW EXCLUSIVEの処理の後 UPDATE文や、INSERT、削除などを行おうと思っています。 よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>更新処理全体をストアドプロシージャで呼ぶという事ですが Oracleのプロシージャで行うと言う事でしょうか? そうです。PL/SQLでOracleのパッケージかスタンドアロンプロシージャを作成し、パラメータを渡してコールする仕組みです。 PL/SQLの書き方はさすがにここで説明できませんが、Oledbでの使い方については「ストアドプロシージャ Oledb」で検索すると詳しい説明の載っているサイトが上位でヒットすると思います。
その他の回答 (3)
- jamshid6
- ベストアンサー率88% (591/669)
私は通常更新処理全体をストアドにして呼んでしまうので、このような書き方はしないのですが、LOCK TABLEにNOWAIT句をつけなければ、リソースのロックが取得できなかった場合は、ロックが取得できるまで待ち続けます。だからExceptionも発生せず実行中のままになるでしょう。 ただ、Oleなどの場合はCommandTimeOutがありますから、そちらにかかればそこでTimeoutのExceptionが発生しますし、ASPであればIISにもタイムアウト設定がありますから、それにも依存する可能性はあるでしょう。
お礼
メッセージありがとうございます。返事遅くなりました。 更新処理全体をストアドプロシージャで呼ぶという事ですが Oracleのプロシージャで行うと言う事でしょうか? 自分としては、登録、更新処理の場合に ロックの処理と、更新・登録を わざわざ分けるのではなく、プロシージャなどで ロックと登録または更新が出来ればいいなと思っているのですが ネットで調べたんですがなかなか載っておらず… どこかいいサイトがあれば教えて下さい。お願い致します。
- jamshid6
- ベストアンサー率88% (591/669)
ASP.NETでしたか。 エラーはtry ~ catchで捕捉できます(OLEなら、OledbException)。 Lockが有効なのはTransactionが維持されている間だけであるということは留意してください。
お礼
メッセージありがとうございます。 もうひとつお聞きしたいのですが Try Catch ex As OledbException Return False End Try Return True なとどして例外が発生した場合、exとして 例外を受け取り、すぐにFalseを返してしまうのでしょうか? WAITを指定する事により、待機状態になるとの事ですが Falseを返さずに待つのでしょうか? お分かりになればよろしくお願い致します。
- jamshid6
- ベストアンサー率88% (591/669)
処理を何で書くのかはわかりませんが、 LOCK TABLE テーブル名称 IN SHARE ROW EXCLUSIVE MODE NOWAITを実行して、ロックに失敗した場合はエラーになります。 「ORA-00054 リソース・ビジー、NOWAITが指定されていました」 (NOWAITを指定しなければ待ちに入るので返ってきません) エラートラップが必要かと思います。 成功した場合は特に何も返らないはずです。
お礼
メッセージありがとうございます。 登録や削除を実行する際に他のユーザから アクセス制限を設けるためにLOCK TABLE 処理を書くつもりでいます。 このORA - 00054は例外としてエラーメッセージが表示する訳ですよね。 エラートラップとはTry ~ Catch ~ Finallyなどでしょうか? 言語がASP.NETなので Try Catch ex As Exception Return False Finally Return True End Try などとしてうまくいくかわかりませんが、処理を分ける事に して見ます。
お礼
メッセージありがとうございます。 処理的にはPLSQLで更新・ロック処理を 1つの処理として出来る事が理想だったのですが 今回はLOCK TABLEではなく、SELECT FOR UPDATEとして ロック処理を行うことにしました。 色々とアドバイスありがとうございました。 (PLSQLの書き方についてはコレからも調べてみます)