【发布时间】: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