- - PR -
DBのロックについて
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-08-05 21:23
それ(短時間・少処理)は悲観的ロック一般に言える話で、論理ロックとして実装しようが、物理ロックとして実装しようが同じだと思います。
例えばOracleではSELECT FOR UPDATE NOWAITという構文を使うと、ロック待ちに入らずに済むので回避できます。SQL Server 2000でもタイムアウトを設定できますよね。 悲観的ロックを論理ロックで実装すると、ABORTしたトランザクションの後始末が面倒臭いので、使用するDBMSにもよりますが、僕はDBMSのロックを利用します。 | ||||||||||||
|
投稿日時: 2005-08-06 01:41
同じだと思いますか。それは私と見解が異なりますね 一つのトランザクションを(コンピュータの観点から)長時間維持する前提での実装は、問題が 出る場合が多いのではないですか。もちろん実際に使用するのと同じ負荷をかけて問題が 出なければ、そのような実装でもいいわけですが。
はい、NOWAITオプションについては後から思い出しました ですのでロック待ちしないようにはできますね。
確かに面倒くさいですが、DBMSのロックをビジネストランザクションに利用できるのは、 前にも書いたとおり限られた場合だと思います。Webアプリケーションを作ることが多いのも ありますし、DBアクセス部分を隠蔽した作りにするせいもありますが、ビジネストランザクションに DBMSのロックはまず使わないですね。 | ||||||||||||
|
投稿日時: 2005-08-06 01:47
ここまで書いておいて、SUNNYDAYさんがいわゆるビジネストランザクションを前提としている
のか、通常のトランザクションを前提としているのか、わかっていないことに気づきました。 最初の書き込みにおける一連の処理は、複数の画面にまたがるなど時間の掛かる処理ではなく、 通常の一トランザクションで実行される処理でしょうか。であれば、SELECT FOR UPDATEなど データベースのロック機構を使うことで実装して問題ないと思いますが。 | ||||||||||||
|
投稿日時: 2005-08-08 10:43
見解をもう少しクリアにしておきます。
何が本当に最適なのかは、 ・アプリ/システムの構成(Web、C/Sなど)に依存する Webで複数画面にまがたるトランザクションを通じてDBMSロックを保持させるのは僕も反対。 ・使用するDBMSにも依存する ロックを取得するたびにリソースが消費されるタイプのDBMSもあれば、そうでないタイプもある。 タイムアウトを設定できるものもあれば、そうでないものもある。 なので、ここらへんを限定しない議論で、「悲観的ロック戦略では論理ロックによる実装が一般的」という意見には賛成できません。
前述の通り、使用するDBMSのタイプによると思います。 ロックリソースが限られているDB2やMSSQLではそうかもしれません。OracleやPostgreSQL、MySQL(InnoDB)ではそれほど問題にならないと思います。 そしてアプリの観点からは、物理ロックだろうが論理ロックだろうが、アプリから見ればどちらもロックなので、長時間のロックが好ましくないのは同じだと思います。 | ||||||||||||
|
投稿日時: 2005-08-08 18:38
こんばんわ。
いつもお世話になっております。 カーニーさん、ukさん、ご返答ありがとうございました。 返信が遅くなりまして、申し訳ありません。 最初の私の質問の言葉が足りず、すみませんでした。 私の質問は、通常のトランザクションをイメージしたものでした。 ただ、ビジネストランザクションについても、 お二方のやり取りを拝見させていただき、勉強になりました。 これを踏まえて、もっとDBについて勉強したいと思います。 ありがとうございました。 | ||||||||||||
