ロックは、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つの別々のトランザクションで、次のように、それぞれが即時ロックを使用して、特定のデータベース行のデータを変更するとします。
Transaction1
で、アプリケーションによりsetAttribute()
がコールされるか、行のデータが変更されます。Transaction1
により、その行に対して即座にロックが取得されます。
Transaction2
では、アプリケーションは同じ行のデータを変更します。アプリケーションは、その行に対するロックの取得を試行しますが、AlreadyLockedException
を受け取ります。
即時ロックは最も安全なロック・モードですが、Webアプリケーションなどの、思考時間の長いアプリケーションの場合は、長時間にわたって行が占有される場合があります。トランザクションがデータを変更した後、コミットまたはロールバックまでに長時間待機していると、他のトランザクションはそのデータを変更できません。
コミット時ロック・モードの方が、即時ロック・モードより効率的です。コミット時ロックを使用するトランザクションでは、変更と同時に行をロックするのではなく、変更をデータベースにポストする直前にロックを取得します。行に対する変更をポストする最初のトランザクション(キャッシュにある行を変更する最初にトランザクションではなく)によってロックが取得されます。後続のトランザクションでその行を変更しようとすると例外が受け取られます。
たとえば、Transaction1
およびTransaction2
は、2つの別々のトランザクションで、次のように、それぞれがコミット時ロックを使用して、特定のデータベース行のデータを変更するとします。
Transaction1
で、アプリケーションによりsetAttribute()
がコールされるか、行のデータが変更されます。Transaction1
は、まだその行に対するロックを取得しません。
Transaction2
では、アプリケーションは同じ行のデータを変更します。
Transaction2
で、アプリケーションによりcommit()
またはpostChanges()
がコールされます。変更をポストする前に、Transaction2
でその行に対するロックが取得されます。
Transaction1
で、アプリケーションによりcommit()
またはpostChanges()
がコールされます。変更をポストする前に、Transaction1
によりその行に対するロックの取得が試みられます。ところが、その行はこのトランザクションの外部ですでに変更されているため、Transaction1
はRowInconsistentException
を受け取ります。
RowInconsistentException
を捕捉するコードを記述して処理できます。
自動的にはロックを取得しないようにOracle ADF Business Componentsを構成することもできます。その場合には、行を手動でロックでき、ロックはデータベースで行が変更された時点で取得されます。
行のロック
行の手動ロック
Oracle ADF Business Componentsのキャッシュ管理について
行の更新
トランザクションのコミット
コミットを伴わないデータのポスト
Copyright © 1997, 2007, Oracle. All rights reserved.