LOTUS CONNECTOR
自動コミットモード
自動コミットモードで作業する場合、各行の変更は、ODBCResultSet オブジェクトの UpdateRow または DeleteRow の各メソッドで変更を完了するとすぐに、バックエンドデータベースに対してコミットされます。変更内容は即座にコミットされるため、ロールバックはできません。部分的に 1 行ずつ更新する場合は、別の行へ移る前に変更内容が記録されたことが分かるため、自動コミットモードは適切です。しかし、多数の行を変更する場合、自動コミットモードでは膨大なオーバーヘッドがかかってしまいます。
変更内容をバックエンドデータベースにコミットしている間、DBMS は更新するすべての行と、その行に関連するデータベースカタログ中の部分をロックする必要があります。さらに、トランザクションログはパージできるようにロックされます。このような処理が行われている間、他のユーザーはトランザクションログやデータベースのロックされた部分を変更することはできません。他のユーザーはこれらの領域がロック解除されるまで待ってから、自分自身の更新作業のためにロックし、後で再びロック解除しなければなりません。
大量のレコードが個別にコミットされると、DBMS はトランザクションログ、データベース、およびカタログのロックとロック解除を管理するために膨大なリソースを使用します。データベースへのアクセスを競合するユーザー数が多いほど、更新の管理に必要なリソースは多くなります。ユーザーはイベントが発生するまでより長時間待たなければならず、マルチプロセッシングが通常提供する「並行性」の意味が失われます。
自動コミットモードで作業したい場合、ODBCConnection オブジェクトの AutoCommit プロパティを使用して、自動コミットモードが有効かどうかを確認し、有効でなければそれを有効にします。使用する DBMS によっては、自動コミットモードで作業する必要があります。
トランザクションモード
トランザクションモードで作業する場合、最後のコミット以降のすべての変更は、DBMS によってトランザクションログに保存されます。ユーザーが手動でコミットを開始するか、データベースへの接続を終了するまでは、データベース自体には変更内容は記録されません。そのためいつでも、トランザクションログ中にある更新内容をロールバックし、バックエンドデータベースに変更が記録されないようにすることもできます。
指定した数のレコードが更新された後や特定の論理的なトランザクションが完了した後にコミットアクションが発生するように、タイミングを指定できます。また、バックエンドデータベースとの接続を終了するときに、トランザクションログに残っている更新を自動的にコミットすることもできます。
まとまった数のレコードが変更された後で更新をコミットすれば、レコードをより迅速に処理できる一方で、障害が発生したときも作業内容が失われないように定期的にバックエンドデータベースに変更内容を記録できます。たとえば、一連の従業員レコードの [Department Name] フィールドを更新するとき、100 レコードが更新されるたびに変更内容をコミットできます。
論理的なトランザクションが発生した後に更新内容をコミットすれば、バックエンドデータベースを更新する前にトランザクション全体が成功であることを確証したり、トランザクションが失敗だった場合に完了前に更新内容をロールバックしたりできます。たとえば、普通預金口座から当座預金口座へ送金する場合、普通預金口座の借方に記録し、当座預金口座の貸方に記録してから、初めて更新内容をバックエンドデータベースにコミットします。当座預金口座の貸方への記録が失敗した場合、普通預金口座への変更内容をロールバックして、トランザクション全体を後で再試行できます。
バックエンドデータベースとの接続を終了するときに更新内容をコミットすると、トランザクションログに残っている変更が不用意に失われることもありません。この方法は一般的に推奨されます。
トランザクションモードでレコードを処理する場合、障害が発生してロールバックしなければならないときにどこから作業を再開すべきか分かるように、変更内容を追跡する方式を実装する必要があります。
お使いの DBMS でトランザクションモードがサポートされているかどうかは、ODBCConnection オブジェクトの IsSupported メソッドを使用して確認します。サポートされていれば、AutoCommit プロパティを使用してバックエンドデータベース用に自動コミットモードが有効になっているかどうかを調べ、必要であればそれを無効にします。
トランザクションモードで作業中、手動で更新内容を記録するには、CommitTransactions メソッドを使用し、バックエンドデータベースとの接続を終了する際にトランザクションログ中の残りの更新内容を自動的に記録するには、CommitOnDisconnect プロパティを使用します。トランザクションログ内の更新内容をバックエンドデータベースに記録せずに削除するには、RollbackTransactions メソッドを使用します。