處理交易認可失敗

注意

僅限 EF6.1 及更新 版本 - 在 Entity Framework 6.1 中導入了此頁面所討論的功能、API 等。 如果您使用的是較早版本,則不適用部分或全部的資訊。

在 6.1 中,我們引進了 EF 的新連線復原功能:當暫時性連線失敗影響交易認可認可時,能夠自動偵測和復原。 案例的完整詳細資料最好在部落格文章 SQL 資料庫 連線和等冪性問題 中描述。 總而言之,案例是,在交易認可期間引發例外狀況時,有兩個可能的原因:

  1. 伺服器上的交易認可失敗
  2. 交易認可在伺服器上成功,但連線問題導致成功通知無法連線到用戶端

當第一個情況發生時,應用程式或使用者可以重試作業,但應避免第二種情況重試,而且應用程式可以自動復原。 挑戰在於,如果無法偵測認可期間回報例外狀況的實際原因為何,應用程式就無法選擇正確的動作路線。 EF 6.1 中的新功能可讓 EF 在交易成功且透明地採取正確的動作時,與資料庫進行雙重檢查。

使用此功能

若要啟用此功能,您需要在 DbConfiguration 的建構函式中包含 SetTransactionHandler 呼叫 。 如果您不熟悉 DbConfiguration ,請參閱 程式碼型 設定。 這項功能可以與 EF6 中引進的自動重試搭配使用,這在交易因暫時性失敗而無法認可伺服器的情況中有所説明:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;

public class MyConfiguration : DbConfiguration  
{
  public MyConfiguration()  
  {  
    SetTransactionHandler(SqlProviderServices.ProviderInvariantName, () => new CommitFailureHandler());  
    SetExecutionStrategy(SqlProviderServices.ProviderInvariantName, () => new SqlAzureExecutionStrategy());  
  }  
}

追蹤交易的方式

啟用此功能時,EF 會自動將新的資料表新增至名為 __Transactions 的資料庫。 每次 EF 建立交易時,都會在此資料表中插入新的資料列,如果認可期間發生交易失敗,則會檢查該資料列是否存在。

雖然 EF 會盡最大努力在不再需要資料表時從資料表剪除資料列,但如果應用程式過早結束,而且基於這個原因,在某些情況下,您可能需要手動清除資料表。

如何使用舊版處理認可失敗

在 EF 6.1 之前,沒有機制可處理 EF 產品中的認可失敗。 有數種方式可以處理可套用至舊版 EF6 的這種情況:

  • 選項 1 - 不執行任何動作

    在交易認可期間連線失敗的可能性很低,因此如果實際發生此狀況,您的應用程式可能會只失敗。

  • 選項 2 - 使用資料庫重設狀態

    1. 捨棄目前的 DbCoNtext
    2. 建立新的 DbCoNtext,並從資料庫還原應用程式的狀態
    3. 通知使用者,最後一項作業可能尚未順利完成
  • 選項 3 - 手動追蹤交易

    1. 將非追蹤資料表新增至資料庫,以用來追蹤交易的狀態。
    2. 在每個交易的開頭插入一個資料列到資料表中。
    3. 如果認可期間連接失敗,請檢查資料庫中對應的資料列是否存在。
      • 如果資料列存在,請正常繼續,因為交易已成功認可
      • 如果資料列不存在,請使用執行策略重試目前的作業。
    4. 如果認可成功,請刪除對應的資料列,以避免資料表成長。

此部落格文章 包含在 SQL Azure 上完成此作業的範例程式碼。