ロストアップデートとは?その処理方法を解説

Rabiloo

データベースは、ウェブサイトやソフトウェア、あるいはあらゆるシステムに不可欠な部分です。データを安全に、かつ損失なく保つことはシステムを構築する上で極めて重要です。
しかし、システムに多くのユーザーがアクセスし、同時に同じデータに干渉している場合、更新時にデータ損失が発生することがあります。
この問題は「ロストアップデート」と呼ばれます。
このような事態を避けるためには、どのようにデータを扱えば良いのでしょうか。
Rabilooブログの本記事では、「ロストアップデート」の問題とその処理の方法について取り上げたいと思います。
ロストアップデートとは?
ロストアップデートとは「失われた更新」つまり、複数のユーザーが同時にアクセスしたときに起こる、更新したはずのデータが「失われてしまう」つまり、更新が反映されていない現象のことをいいます。
ロストアップデートの例
上記の例で、AliceとBobがトランザクション処理をしてデータベースにアクセスしています。
AliceはQty = 2と更新しましたが、更新した後にQty = 9になってることに気づきます。
これは、BobがAliceより後にQty = 9の値を更新したためで、システムはBobが更新したデータを返します。
しかし、AliceはBobが同時に更新していたことを知らないため、システムに問題があると考えます。
ロストアップデートを処理しない場合の結果は以下のようになります。
-
システムエラーが発生し、最悪のユーザー体験になります。
-
データ損失。システムの規模が大きくなればなるほど、データ損失の量も大きくなります。
-
予約システムでは売り上げに深刻な影響を与えます。
関連記事: Amazon RDSとは?クラウドストレージサービスの概要
ロストアップデートの処理方法
ロストアップデートの処理方法としては、ロック(排他制御)があります。
ロックとは複数のユーザーが同時にデータベースを更新しても矛盾が起きないようにするしくみです。
ここでは、最も一般的な2つの処理方法として楽観ロックと悲観ロックを取り上げます。
楽観ロック (Optimistic Locking)
楽観ロックとは、同時アクセスはあまり起きないだろうという楽観的なロックのことです。楽観ロックではどのユーザーもデータの読み取りと更新を行うことができます。ただし、複数のユーザーが同じデータを更新するために同じアクションを実行した場合、最初に更新を実行したユーザーが正常に更新されます。
残りのユーザーには、データが使用中であることが通知され、その時点では更新を行うことができず、後で再試行することができます。ECサイトなどに使われます。
楽観ロックのメリットは、データ更新中にデータをロックせず、そのデータが更新されているときだけ例外を投げることです。
この方法のデメリットは、更新に失敗した場合、ユーザーは何度もページの更新や再読み込みを試さなければならないため、ユーザーエクスペリエンスの低下につながる可能性があります。
Spring data JPAで楽観ロックを有効にする
悲観ロック (Pessimistic locking)
悲観ロックとは、同じデータを他者が頻繁に更新するだろうという悲観的な排他制御のことです。悲観ロックを使用すると、ユーザーがアクセスするデータは、ユーザーが更新処理を完了するまでロックされます。このデータは、ロックされている間は他のユーザーがアクセスすることはできません。
この方法は、パフォーマンスが向上しますが、ECサイトなど大勢のユーザーがアクセスするシステムなど、大規模な実装は困難です。
Spring data JPAで悲観ロックを有効にする
まとめ
今回の記事では、データ更新を扱う際のリスクと、ロストアップデートへの対処法を簡単にご紹介しました。
弊社ラビローは、高いセキュリティとユーザーのデータ紛失を防ぐためのソリューションを備えたWebサイト制作サービスも提供しております。
WEBアプリケーション、ECサイト制作のご依頼、ご相談はお気軽にお寄せください。