次の方法で共有


トランザクション処理

トランザクション は、接続全体で実行される一連のデータ アクセス操作の開始と終了を区切ります。 データ ソースのトランザクション機能に従って、Connection オブジェクトを使用すると、トランザクションを作成および管理することもできます。 たとえば、Microsoft OLE DB Provider for SQL Server を使用して Microsoft SQL Server 上のデータベースにアクセスすると、実行するコマンドに対して複数の入れ子になったトランザクションを作成できます。

ADO を使用すると、トランザクションでの操作に起因するデータ ソースへの変更が正常に一緒に行われるか、まったく行われません。

トランザクションを取り消した場合、またはその操作のいずれかが失敗した場合、結果はトランザクション内のどの操作も発生しなかったかのようになります。 データ ソースは、トランザクションが開始される前と同じままです。

ADO には、トランザクションを制御するための次のメソッドが用意されています。 BeginTransCommitTrans、および RollbackTrans します。 ソース データに対して行われた一連の変更を 1 つの単位として保存またはキャンセルする場合は、Connection オブジェクトでこれらのメソッドを使用します。 たとえば、口座間で送金するには、一方から金額を減算し、同じ金額を他方に加算します。 いずれかの更新が失敗した場合、アカウントの残高はなくなります。 開いているトランザクション内でこれらの変更を行う場合、変更のすべてまたはまったく反映されないようにします。

手記

すべてのプロバイダーがトランザクションをサポートしているわけではありません。 Connection オブジェクトの Properties コレクションに、プロバイダー定義プロパティ "Transaction DDL" が表示されていることを確認します。これは、プロバイダーがトランザクションをサポートしていることを示します。 プロバイダーがトランザクションをサポートしていない場合、これらのメソッドのいずれかを呼び出すとエラーが返されます。

BeginTrans メソッドを呼び出した後、CommitTrans または RollbackTrans を呼び出してトランザクションを終了するまで、プロバイダーは変更を即座にコミットしなくなります。

CommitTrans メソッドを呼び出すと、接続で開いているトランザクション内で行われた変更が保存され、トランザクションが終了します。 RollbackTrans メソッドを呼び出すと、開いているトランザクション内で行われた変更が元に戻され、トランザクションが終了します。 開いているトランザクションがない場合にいずれかのメソッドを呼び出すと、エラーが生成されます。

Connection オブジェクトの Attributes プロパティに応じて、CommitTrans メソッドまたは RollbackTrans メソッド 呼び出すと、新しいトランザクションが自動的に開始される場合があります。 Attributes プロパティが adXactCommitRetaining に設定されている場合、CommitTrans 呼び出しの後、プロバイダーは自動的に新しいトランザクションを開始します。 Attributes プロパティが adXactAbortRetainingに設定されている場合、RollbackTrans 呼び出しの後に、プロバイダーは自動的に新しいトランザクションを開始します。

トランザクション分離レベル

Connection オブジェクトでトランザクションの分離レベルを設定するには、IsolationLevel プロパティを使用します。 この設定は、次に BeginTrans メソッドを呼び出すまで有効になりません。 要求した分離レベルが使用できない場合、プロバイダーは次に高いレベルの分離を返す可能性があります。 有効な値の詳細については、ADO プログラマ リファレンスの IsolationLevel プロパティを参照してください。

入れ子になったトランザクション

入れ子になったトランザクションをサポートするプロバイダーの場合は、開いているトランザクション内で BeginTrans メソッドを呼び出すと、入れ子になった新しいトランザクションが開始されます。 戻り値は入れ子のレベルを示します。戻り値 "1" は、最上位レベルのトランザクションを開いた (つまり、トランザクションが別のトランザクション内で入れ子になっていない) ことを示します。"2" は、第 2 レベルのトランザクション (最上位レベルのトランザクション内で入れ子になったトランザクション) を開いたことを示します。 CommitTrans または rollbackTrans 呼び出すと、最後に開かれたトランザクションにのみ影響します。上位レベルのトランザクションを解決する前に、現在のトランザクションを閉じるかロールバックする必要があります。