質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

17236閲覧

Webアプリケーションのデータ更新で楽観ロックを使う理由について

k499778

総合スコア599

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

2クリップ

投稿2015/01/18 07:37

Javaプログラミング初心者です。
排他的制御について質問させてください。

私の使っているWebアプリケーションでは
Webオンライン上で複数のユーザが同じデータを更新することが出来るシステムで、排他制御の仕組みを使っています。
それが、まさしく楽観ロックなのですが、
なぜ悲観ロックではなく、楽観ロックを使っているのでしょうか?

このようなWebアプリにおいて、
悲観より楽観の方が適している理由やメリットなどを教えていただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

(悲観、楽観は別のご質問で回答しましたので、ここでは省きますが。)
まず、webアプリの特徴とはどういったことが挙げられるでしょうか?
そして、悲観排他をしようした場合、どういったことが起こりえるでしょうか?
そうすると、おのずとなぜ楽観排他を使っているのか、が見えてくると思います。

投稿2015/01/18 15:28

shiina

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2015/01/18 15:52

webアプリなので多くの利用者がいるため複数のユーザーが同時更新する可能性がある。 悲観ロックだと読み込みの時点でロックがかかり、その間、他ユーザーは更新ができないのでユーザビリティ?機能性?が落ちる。 また悲観だと、ロックをかけたまま放置しておくと、他のユーザーがいつまでたっても更新できない。さらに、ロックをかけた状態で以上終了すると、DBのロックが残り、DB管理者がロックを外しにいかなくてはならない。その際、何よりも業務が回らなくなる。 こういったデメリットが悲観ロックにはあるため、先に更新したユーザーのデータを正とする楽観ロックが推奨されている。 私の今ある知識では、このような見解が精一杯なのですが、 この認識は間違っているでしょうか? 厚かましいお願いかもしれませんが、もしご返答いただけるならお願い致します。
k499778

2015/01/18 15:54

× 以上終了 ○ 異常終了 追記:(デッド)ロックを気にする必要がない楽観ロックが推奨されている?
shiina

2015/01/18 17:56

起こりえることはお考えのとおりです。 また、悲観的ロックはそのトランザクション内で有効になります。 大概のwebでは、入力画面→確認画面→登録更新処理、となりますよね。 この間、リクエストは分断されますので、トランザクションを保持し続けることができません。 したがって、悲観ロックでは無理が生じます。 製品によっては、悲観ロックをした場合に、selectも制限されるものがあるので注意が必要です。 (数年前に、共有のSQLServerとつなぎっぱなしのwinアプリの開発をお手伝いしたときに、設計者が悲観ロックで作ってしまい、selectもできなくなるためにひどい目にあったことがあります) webでは楽観排他にしておいて、先に他のユーザが更新していた場合は、元の確認画面等に戻して、「他のユーザによって更新されいます」のようなメッセージをだして、ユーザ側に確認をするよう促すのが一般的です。 こういったことは、実際にものを作ってみないとわからないことですし、調べるだけでは限界があると思います。 どんどん先輩方に聞いて、ノウハウをためてくださいね。 余談ですが。 楽観排他にしたからといって、デッドロックを気にしなくてよいわけではありません。 update/deleteを実行したレコードはそのトランザクションによってロックされています。insertの場合はテーブルごとロックされることもあります。 複数のテーブルにわたって同時に処理を行うことはよくあることだと思いますが、その順番を間違えると、デッドロックが発生しますのでご注意ください。 (常に親テーブル→子テーブルの順にクエリを発行する等、プロジェクトでとりきめがあるはずですので、それに従ってください)
k499778

2015/01/19 10:38

shiinaさん、とても丁寧でわかりやすい説明ありがとうございます。 おかげで悩みが解決しましたし、さらに勉強しようと思えるような刺激もいただきました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問