Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » Ultra Light データベース管理とリファレンス » Ultra Light のパフォーマンスに関するヒント » 挿入と更新のパフォーマンスのヒント » トランザクションとローのステータスの管理

 

Ultra Light でのトランザクション処理

トランザクションは、自動的に実行される処理の論理セットです。つまり、トランザクションのすべての処理がデータベースに格納されるか、トランザクションの処理が 1 つもデータベースに格納されないかのどちらかです。Ultra Light ランタイムへの Ultra Light アプリケーションのアクセスは直列化されます。複数のトランザクションを同時に開くことは可能ですが、Ultra Light では一度に 1 つのトランザクションしか処理されません。これにより、アプリケーションでは以下の現象が発生しません。

  • トランザクションがブロックされること (デッドロック)。Ultra Light が既存のローロックに基づいて要求をブロックすることはありません。このような事態になった場合、Ultra Light はすぐにエラーを返します。

  • 未処理の変更を上書きすること。トランザクションは、他のトランザクションの未処理の変更を上書きすることはできません。トランザクションによってローが変更されると、Ultra Light は、トランザクションが「コミット」または「ロールバック」されるまで、このローをロックします。ロックによって、他のトランザクションはローを読み込むことはできても、ローを変更できなくなります。

ヒント

Ultra Light J および C++ のAPI を除くすべての Ultra Light API は、「オートコミット」モードで動作します。

オートコミットモードでは、Ultra Light は各操作の後にコミットを実行します。一部の API はデフォルトでオートコミットを使用します。これらのインターフェイスのいずれかを使用している場合、複数操作トランザクションを使用するには、オートコミットをオフに設定します。オートコミットをオフに設定する方法は、使用しているプログラミングインターフェイスによって異なります。ほとんどのインターフェイスでは、これは接続オブジェクトのプロパティです。

次の項を参照してください。

たとえば、A と B という 2 つのアプリケーションが 1 つのデータベースの同じローを読み取っており、どちらもそのデータに基づいて当該ローのカラムの 1 つに入る新しい値を計算するとします。A がローを新しい値で更新し、B が同じローを変更しようとした場合、B はエラーになります。ロックされたローを変更しようとするとエラー SQLCODE SQLE_LOCKED が設定され、削除されたローを変更しようとするとエラー SQLE_NOTFOUND が設定されます。したがって、データの変更を試行した後には SQLCODE 値をチェックするようアプリケーションをプログラムしてください。

 参照