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

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

ただいまの
回答率

91.86%

  • データベース

    430questions

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

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

解決済

回答 1

投稿 2015/01/18 16:37

  • 評価
  • クリップ 0
  • VIEW 6,621

k499778

score 427


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

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

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

こんにちは。

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

投稿 2015/01/19 00:28

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2015/01/19 00:52

    webアプリなので多くの利用者がいるため複数のユーザーが同時更新する可能性がある。
    悲観ロックだと読み込みの時点でロックがかかり、その間、他ユーザーは更新ができないのでユーザビリティ?機能性?が落ちる。
    また悲観だと、ロックをかけたまま放置しておくと、他のユーザーがいつまでたっても更新できない。さらに、ロックをかけた状態で以上終了すると、DBのロックが残り、DB管理者がロックを外しにいかなくてはならない。その際、何よりも業務が回らなくなる。

    こういったデメリットが悲観ロックにはあるため、先に更新したユーザーのデータを正とする楽観ロックが推奨されている。

    私の今ある知識では、このような見解が精一杯なのですが、
    この認識は間違っているでしょうか?

    厚かましいお願いかもしれませんが、もしご返答いただけるならお願い致します。

    キャンセル

  • 2015/01/19 00:54

    × 以上終了
    ○ 異常終了

    追記:(デッド)ロックを気にする必要がない楽観ロックが推奨されている?

    キャンセル

  • 2015/01/19 02:56

    起こりえることはお考えのとおりです。

    また、悲観的ロックはそのトランザクション内で有効になります。
    大概のwebでは、入力画面→確認画面→登録更新処理、となりますよね。
    この間、リクエストは分断されますので、トランザクションを保持し続けることができません。
    したがって、悲観ロックでは無理が生じます。

    製品によっては、悲観ロックをした場合に、selectも制限されるものがあるので注意が必要です。
    (数年前に、共有のSQLServerとつなぎっぱなしのwinアプリの開発をお手伝いしたときに、設計者が悲観ロックで作ってしまい、selectもできなくなるためにひどい目にあったことがあります)

    webでは楽観排他にしておいて、先に他のユーザが更新していた場合は、元の確認画面等に戻して、「他のユーザによって更新されいます」のようなメッセージをだして、ユーザ側に確認をするよう促すのが一般的です。

    こういったことは、実際にものを作ってみないとわからないことですし、調べるだけでは限界があると思います。
    どんどん先輩方に聞いて、ノウハウをためてくださいね。


    余談ですが。

    楽観排他にしたからといって、デッドロックを気にしなくてよいわけではありません。
    update/deleteを実行したレコードはそのトランザクションによってロックされています。insertの場合はテーブルごとロックされることもあります。
    複数のテーブルにわたって同時に処理を行うことはよくあることだと思いますが、その順番を間違えると、デッドロックが発生しますのでご注意ください。
    (常に親テーブル→子テーブルの順にクエリを発行する等、プロジェクトでとりきめがあるはずですので、それに従ってください)

    キャンセル

  • 2015/01/19 19:38

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

    キャンセル

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

ただいまの回答率

91.86%

関連した質問

同じタグがついた質問を見る

  • データベース

    430questions

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

閲覧数の多いデータベースの質問