次の方法で共有


トランザクション処理

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

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

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

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

注意

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

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

CommitTrans メソッドを呼び出すと、接続中のオープン トランザクション内で行われた変更が保存され、トランザクションは終了します。 RollbackTrans メソッドを呼び出すと、オープン トランザクション内で行われた変更が取り消され、トランザクションは終了します。 オープン トランザクションがない場合にいずれかのメソッドを呼び出すと、エラーが発生します。

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

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

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

入れ子構造のトランザクション

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