【问题标题】:WCF Transaction against Azure SQL DB针对 Azure SQL DB 的 WCF 事务
【发布时间】:2016-04-15 13:30:14
【问题描述】:

我正在尝试针对 Azure SQL DB 进行 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 事务中执行它时才会出现此问题。

【问题讨论】:

  • 发布完整的异常是个好主意。您还应该为 SqlConnection 和 SqlCommand b/c 实现 using 语句,它们都实现了 IDisposable。
  • 这是一个概念验证测试项目。这就是它缺少 using 子句的原因。

标签: c# wcf azure transactions


【解决方案1】:

我怀疑问题在于 WCF 事务依赖于 Azure 本身不支持的分布式事务协调器。

SQL Azure 中对分布式事务的唯一支持是更新的 SQL 原生弹性事务,支持作为 .NET 4.6.1 的一部分引入:

SQL Azure elastic transactions

【讨论】:

  • 我正在使用 .NET Framework 4.6.1 和 Azure SQL DB V12。
  • 是的,但是 WCF 不支持传播这些新的弹性事务。它仅适用于 SQL Azure 不支持的较旧的 DTC 样式事务。
  • 在服务边界之外启动事务并将其流经对 SQL Azure 的两个服务调用...是的,目前不支持。
猜你喜欢
  • 2013-10-04
  • 2014-04-02
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2022-10-08
  • 2016-11-24
相关资源
最近更新 更多