Object Services のトランザクションの管理 (Entity Framework)
Object Services では、自動トランザクション参加がサポートされています。つまり、クエリの実行やデータ ソース内のデータに対する変更の保存など、オブジェクト コンテキスト内で実行されるアクティビティは、System.Transactions トランザクション内で操作を行うことによってデータ ソースで分離できます。トランザクションを Object Services と共に使用すると、次のような操作を行うことができます。
オブジェクトの変更が正常に完了しないと失敗するクエリなど、整合性の高さが求められる複数の操作をデータ ソースに対して行う。
電子メール通知の送信やメッセージ キューへの書き込みなど、オブジェクト コンテキスト内の変更を他の分散処理に合わせてコーディネートする。
追加のリソース マネージャを参加させることが必要となるトランザクションを、分散トランザクションと呼びます。分散トランザクションでは、トランザクションの完了に必要となるリソースを管理するために、分散トランザクション コーディネータ (DTC) が使用されます。トランザクションを DTC にエスカレートさせるプロセスには、作成と実行に比較的多くのリソースが必要になる場合があります。SQL Server 2005 などの一部のリソース マネージャでは、Promotable Single Phase Enlistment (PSPE) トランザクション プロトコルがサポートされています。そのため、リソース マネージャがホストするトランザクションは、分散トランザクション コーディネータ (DTC) によって管理されるように、後で必要に応じてエスカレートさせることができます。
詳細については、MSDN ライブラリの「トランザクション処理」を参照してください。
トランザクションを Object Services と共に使用する場合は、以下の点を考慮する必要があります。
データ ソースに対する操作のみがトランザクション処理されます。オブジェクト コンテキストでのオブジェクトに対する変更は、トランザクション処理されません。コンテキスト内のオブジェクトに対して加えた変更は、トランザクション スコープ外で表示されます。
SaveChanges を呼び出した場合に、現在のトランザクションが存在すると、このトランザクションはデータ ソースに対する操作で Object Services によって使用されます。それ以外の場合は、操作用の新しいトランザクションが作成されます。トランザクションを定義するには、EntityTransaction、Transaction または TransactionScope を使用します。
[!メモ]
既存のトランザクションに参加するために、Object Services によって接続がいったん閉じられ、再度開かれる場合があります。
Object Services が SaveChanges 操作の新しいトランザクションを作成した場合、オブジェクト コンテキスト内のオブジェクトに対する変更は、そのトランザクションが完了するまで受け入れられません。これにより、オブジェクト コンテキストとデータ ソースの状態が一致するようになります。
トランザクションで操作を再試行する予定がある場合は、トランザクションが完了する前にコンテキスト内のオブジェクトのステータスがリセットされないようにする必要があります。これを行うには、acceptChangesDuringSave パラメータに値 false を指定して SaveChanges を呼び出してから、トランザクションの他の操作が正常に完了した後で AcceptAllChanges を呼び出します。詳細については、「Object Services のトランザクションを管理する方法 (Entity Framework)」を参照してください。
コーディネート型トランザクションを使用した再試行操作では、AcceptAllChanges を最初に呼び出さずに、2 回目に SaveChanges を呼び出すことができます。この場合、Object Services は、同じ変更をデータ ソースに再適用しようとします。
参照
概念
Entity Framework 用の EntityClient プロバイダ
Object Services の接続の管理 (Entity Framework)