ロック・モードについて

ロックは、2人のユーザーが同一の行を互いに異なる2通りの方法で変更した結果発生する、データの競合を防止するRDBMS機能です。Oracle ADF Business Componentsには、データベース行に対して自動的にロックを取得する機能があります。

Oracle ADF Business Componentsでは、次の3つのロック・モードのいずれかを使用して、行に対するロックを取得できます。

ロック・モードの変更方法の詳細は、「ロック・モードの変更」を参照してください。

即時ロック・モード

デフォルトでは、Oracle ADF Business Componentsでは即時ロック・モードが使用されます。つまり、ある行のデータが変更されると、Oracle ADF Business Componentsによってただちにその行に対するロックが取得されます。Oracle ADF Business Componentsのキャッシュにある行を変更する最初のトランザクションにより、ロックが取得されます。後続のトランザクションでその行を変更しようとすると例外が受け取られます。

たとえば、Transaction1およびTransaction2は2つの別々のトランザクションで、次のように、それぞれが即時ロックを使用して、特定のデータベース行のデータを変更するとします。

  1. Transaction1で、アプリケーションによりsetAttribute()がコールされるか、行のデータが変更されます。Transaction1により、その行に対して即座にロックが取得されます。
  2. Transaction2では、アプリケーションは同じ行のデータを変更します。アプリケーションは、その行に対するロックの取得を試行しますが、AlreadyLockedExceptionを受け取ります。

即時ロックは最も安全なロック・モードですが、Webアプリケーションなどの、思考時間の長いアプリケーションの場合は、長時間にわたって行が占有される場合があります。トランザクションがデータを変更した後、コミットまたはロールバックまでに長時間待機していると、他のトランザクションはそのデータを変更できません。

コミット時ロック・モード

コミット時ロック・モードの方が、即時ロック・モードより効率的です。コミット時ロックを使用するトランザクションでは、変更と同時に行をロックするのではなく、変更をデータベースにポストする直前にロックを取得します。行に対する変更をポストする最初のトランザクション(キャッシュにある行を変更する最初にトランザクションではなく)によってロックが取得されます。後続のトランザクションでその行を変更しようとすると例外が受け取られます。

たとえば、Transaction1およびTransaction2は、2つの別々のトランザクションで、次のように、それぞれがコミット時ロックを使用して、特定のデータベース行のデータを変更するとします。

  1. Transaction1で、アプリケーションによりsetAttribute()がコールされるか、行のデータが変更されます。Transaction1は、まだその行に対するロックを取得しません。
  2. Transaction2では、アプリケーションは同じ行のデータを変更します。
  3. Transaction2で、アプリケーションによりcommit()またはpostChanges()がコールされます。変更をポストする前に、Transaction2でその行に対するロックが取得されます。
  4. Transaction1で、アプリケーションによりcommit()またはpostChanges()がコールされます。変更をポストする前に、Transaction1によりその行に対するロックの取得が試みられます。ところが、その行はこのトランザクションの外部ですでに変更されているため、Transaction1RowInconsistentExceptionを受け取ります。

RowInconsistentExceptionを捕捉するコードを記述して処理できます。

手動ロック・モード

自動的にはロックを取得しないようにOracle ADF Business Componentsを構成することもできます。その場合には、行を手動でロックでき、ロックはデータベースで行が変更された時点で取得されます。


行のロック
行の手動ロック
Oracle ADF Business Componentsのキャッシュ管理について
行の更新
トランザクションのコミット
コミットを伴わないデータのポスト

 

 

Copyright © 1997, 2004, Oracle. All rights reserved.