2016-04-15 52 views
0

我正在嘗試針對Azure SQL數據庫創建一個WCF事務,該數據庫證明迄今爲止尚未成功。 下面是一個例子:針對Azure SQL數據庫的WCF事務

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required)) 
{ 
     try 
     { 
      ServiceReference1.Service1Client proxy1 = new ServiceReference1.Service1Client(); 
      proxy1.UpdateData(); 
      ServiceReference2.Service1Client proxy2 = new ServiceReference2.Service1Client(); 
      proxy2.UpdateData(); 
      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      ts.Dispose(); 
     } 
} 

其中的UpdateData()實現是這樣的:

[OperationBehavior(TransactionScopeRequired = true)] 
public void UpdateData() 
{ 
    SqlConnection objConnection = new SqlConnection(strConnection); 
    objConnection.Open(); 
    SqlCommand objCommand = new SqlCommand("INSERT INTO[Security].[Tenants] VALUES(3, 'test', '2016-04-14 14:20:00", objConnection); 
    objCommand.ExecuteNonQuery(); 
    objConnection.Close(); 
} 

會發生什麼事是connection.Open()拋出一個異常: 對象引用未設置到實例在System.Transactions.Transaction.GetPromotedToken()

如果我嘗試執行此操作沒有事務範圍或在同一服務中的事務範圍它成功執行。只有當我嘗試在WCF事務中執行它時,纔會出現問題。

+1

發佈完整的例外是一個很好的理念。您還應該爲SqlConnection和SqlCommand b/c實現使用語句,它們都實現了IDisposable。 – Wjdavis5

+0

這是一個概念驗證測試項目。這就是爲什麼它缺少使用條款。 –

回答

0

我懷疑問題是WCF事務依賴分佈式事務處理協調器,而Azure本身不支持它。

分佈式事務在SQL Azure中唯一的支持是新的,SQL原生彈性的交易,與引入的.NET 4.6.1部分支持:

SQL Azure elastic transactions

+0

我正在使用.NET Framework 4.6.1和Azure SQL DB V12。 –

+0

是的,但WCF不支持傳播這些新的彈性交易。它僅適用於SQL Azure不支持的較舊的DTC樣式事務。 – JoshL

+0

所以我想我正在嘗試實現的目前是不可能的。 –