回滚事务范围C#

时间:2015-10-12 06:38:21

标签: c# sql-server entity-framework wcf transactions

为了进一步专业化我们的测试方法,我正在使用Visual Studio中的单元测试框架进行一些集成测试。

正在测试的对象是一个WCF服务,我的小应用程序使用ServiceHost在内存中运行服务,我可以调用我的测试中公开的方法。

这一切都运行正常,但我希望能够在测试后使用Transactions恢复数据库。为了实现这一点,我将TransactionScopeRequired属性添加到了测试中的方法,并尝试在TransactionScope中调用它。

但后来我注意到TransactionScope没有内置的回滚方法,因此在方法完成后,创建的对象当然仍在数据库中。

所以我尝试不使用'完整'方法,经过一些谷歌搜索我发现只是使用Dispose手动shoud回滚事务。唉,既没有奏效。所以我继续启动SQL Server Analyzer来查看生成的SQL,也许我可以在那里找到一些TRANSACTION语句。

我注意到的第一件事是所有相关的查询都是作为存储过程(由EF生成)执行的。第二件事是我无法区分相关查询中的任何类型的事务管理。

现在我的问题:无论好坏,这可以在这个级别上解决吗?如果是这样的话?是否可以使用这样的“外部”交易?

2 个答案:

答案 0 :(得分:1)

要回滚交易,您可以:

  1. 致电Transaction.Current.Rollback();
  2. 不要致电Transaction.Complete();
  3. 检查服务器端,Transaction.Current不为null。所以你知道你是否有当前的交易

    允许Tx:

    1. 在界面方法上:

      [OperationContract的]
      [TransactionFlow(TransactionFlowOption.Allowed)]
      public void Method(int value);

    2. 在服务器方法实现上:

      [OperationBehavior(TransactionScopeRequired =真,                  TransactionAutoComplete =真)]
      public void Method(int value){...}

    3. 在客户端和服务器端的绑定允许事务流:

    4. 使用代码:

      var wsHttpBinding = new WsHttpBinding();
      wsHttpBinding.TransactionFlow = true;
      

      或使用XML:

      <endpoint address="wsHttpTx" binding="wsHttpBinding" 
          contract="counters.ICountersService" 
          bindingConfiguration="wsHttpTx"/>
         ...
      <wsHttpBinding>
        <binding name="wsHttpTx" transactionFlow="true" />
      </wsHttpBinding>
      

      此致

答案 1 :(得分:0)

据我了解你的问题: 1)您尝试使用事务范围在Test方法中打开新事务 2)您在此事务范围内调用WCF服务 3)您的服务会进行一些数据库更改。

要回滚更改,您不应该调用事务范围的完整方法。我总是善于在using中创建事务范围,最终自动Dispose。

所以现在您的服务应该支持来自客户端的事务传播。请参阅相同的问题(Calling WCF service method from transaction scope)并阅读MSDN文章(https://msdn.microsoft.com/en-us/library/ms730250.aspx

注意:有几篇文章 - How to enable transactionsHow to configure service

但老实说,对于我来说,如果真正的客户端没有真正的要求来支持事务并且在传输/消息/序列化器级别上没有一些WCF特定的定制(例如WCF拦截器),那么仅仅使得测试事务变得过度。 我要么直接测试服务类,要么不运行服务主机,要么在测试后用手动恢复数据库状态创建某种TearDown清理。