- PR -

DBのロックについて

投稿者投稿内容
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2005-08-05 21:23
引用:

ukさんの書き込み (2005-08-05 19:41) より:
物理的ロックを使用する仕組みだと、コネクションを接続したまま処理をすることが前提に
なります。Webアプリケーションのようなステートレスな通信ではもちろん問題になりやすい
ですが、そうでなくても参照から更新までの時間が短くかつ保障できる、あるいはそもそも
更新処理自体が少なくてそのこと自体が問題になりにくい、などある程度限定した条件でないと
使いにくいと思います。



それ(短時間・少処理)は悲観的ロック一般に言える話で、論理ロックとして実装しようが、物理ロックとして実装しようが同じだと思います。

引用:

また、ロックされているリソースを次に参照しようとしたクライアントはロック待ちになってし
まうわけですが、それでいいのでしょうか。悲観的ロックや楽観的ロックのどちらにしようかと
考えるような要件であれば、ロックされていることを通知して欲しい場合が多いと思うのですが。



例えばOracleではSELECT FOR UPDATE NOWAITという構文を使うと、ロック待ちに入らずに済むので回避できます。SQL Server 2000でもタイムアウトを設定できますよね。

悲観的ロックを論理ロックで実装すると、ABORTしたトランザクションの後始末が面倒臭いので、使用するDBMSにもよりますが、僕はDBMSのロックを利用します。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-08-06 01:41
引用:

それ(短時間・少処理)は悲観的ロック一般に言える話で、論理ロックとして実装しようが、物理ロックとして実装しようが同じだと思います。


同じだと思いますか。それは私と見解が異なりますね
一つのトランザクションを(コンピュータの観点から)長時間維持する前提での実装は、問題が
出る場合が多いのではないですか。もちろん実際に使用するのと同じ負荷をかけて問題が
出なければ、そのような実装でもいいわけですが。

引用:

例えばOracleではSELECT FOR UPDATE NOWAITという構文を使うと、ロック待ちに入らずに済むので回避できます。SQL Server 2000でもタイムアウトを設定できますよね。


はい、NOWAITオプションについては後から思い出しました
ですのでロック待ちしないようにはできますね。

引用:

悲観的ロックを論理ロックで実装すると、ABORTしたトランザクションの後始末が面倒臭いので、使用するDBMSにもよりますが、僕はDBMSのロックを利用します。


確かに面倒くさいですが、DBMSのロックをビジネストランザクションに利用できるのは、
前にも書いたとおり限られた場合だと思います。Webアプリケーションを作ることが多いのも
ありますし、DBアクセス部分を隠蔽した作りにするせいもありますが、ビジネストランザクションに
DBMSのロックはまず使わないですね。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-08-06 01:47
ここまで書いておいて、SUNNYDAYさんがいわゆるビジネストランザクションを前提としている
のか、通常のトランザクションを前提としているのか、わかっていないことに気づきました。

最初の書き込みにおける一連の処理は、複数の画面にまたがるなど時間の掛かる処理ではなく、
通常の一トランザクションで実行される処理でしょうか。であれば、SELECT FOR UPDATEなど
データベースのロック機構を使うことで実装して問題ないと思いますが。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2005-08-08 10:43
見解をもう少しクリアにしておきます。

何が本当に最適なのかは、

・アプリ/システムの構成(Web、C/Sなど)に依存する
 Webで複数画面にまがたるトランザクションを通じてDBMSロックを保持させるのは僕も反対。

・使用するDBMSにも依存する
 ロックを取得するたびにリソースが消費されるタイプのDBMSもあれば、そうでないタイプもある。
 タイムアウトを設定できるものもあれば、そうでないものもある。

なので、ここらへんを限定しない議論で、「悲観的ロック戦略では論理ロックによる実装が一般的」という意見には賛成できません。

引用:

ukさんの書き込み (2005-08-06 01:41) より:
一つのトランザクションを(コンピュータの観点から)長時間維持する前提での実装は、問題が出る場合が多いのではないですか。


前述の通り、使用するDBMSのタイプによると思います。
ロックリソースが限られているDB2やMSSQLではそうかもしれません。OracleやPostgreSQL、MySQL(InnoDB)ではそれほど問題にならないと思います。

そしてアプリの観点からは、物理ロックだろうが論理ロックだろうが、アプリから見ればどちらもロックなので、長時間のロックが好ましくないのは同じだと思います。
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-08-08 18:38
こんばんわ。
いつもお世話になっております。
カーニーさん、ukさん、ご返答ありがとうございました。
返信が遅くなりまして、申し訳ありません。

最初の私の質問の言葉が足りず、すみませんでした。
私の質問は、通常のトランザクションをイメージしたものでした。
ただ、ビジネストランザクションについても、
お二方のやり取りを拝見させていただき、勉強になりました。
これを踏まえて、もっとDBについて勉強したいと思います。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)