【问题标题】:EF 4.1 - Stored Procedure Not Inheriting Pending TransactionEF 4.1 - 不继承待处理事务的存储过程
【发布时间】:2012-01-19 05:53:34
【问题描述】:

我有一个如下所示的集成测试:

using (var tran = Connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{
   try
   {
      // Act.
      var result = controller.Create(something);

      // Assert.
      Assert.IsNotNull(result);
   }
   catch (Exception exc)
   {
      Assert.Fail(exc.Message);
   }
   finally
   {
      tran.Rollback();
      Connection.Close();
   }
}

现在,在那个Create 方法中,我最终调用了一个返回多个结果集的存储过程。

这是调用该 SP 的代码:

var cmd = Database.Connection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "exec dbo.MySP @SomeParam";
cmd.Parameters.Add(new SqlParameter { Value = "test", ParameterName = "SomeParam" });

using (var rdr = cmd.ExecuteReader()) <--- exception thrown here.
{
   // code to read result sets.
}

我得到以下异常:

System.InvalidOperationException:当分配给命令的连接处于挂起的本地事务中时,ExecuteReader 要求该命令具有事务。该命令的 Transaction 属性尚未初始化。

我认为这是有道理的,但我会认为它会继承待处理的本地事务?

我之前让上面的代码打开了一个 new 连接,但由于未提交的读取隔离级别,挂起的事务在某些表上具有明显的锁定,所以它只是超时了。

基本上,我需要能够进行集成测试:

  1. 开启交易
  2. 做一些事情,包括将一些记录保存到数据库中,然后调用另一个存储过程来访问包含新创建的数据的数据
  3. 回滚交易。

各位有什么想法吗?

【问题讨论】:

  • 使用 IsolationLevel.ReadUncommitted 的集成测试不太可能非常健壮(除非您拥有对 DB 的独占访问权限)。
  • @MitchWheat - 那么你有什么推荐的呢?

标签: sql-server-2008 entity-framework stored-procedures transactions entity-framework-4.1


【解决方案1】:

这行得通:

using (new TransactionScope(TransactionScopeOption.Required, 
   new TransactionOptions 
   { 
      IsolationLevel = IsolationLevel.ReadUncommitted
   }))

这不是:

using (var tran = Connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{

一定与TransactionScope 存在于实际连接的外部这一事实有关,因此它包装了在其中打开的所有连接,而之前的代码使用具体联系方式。

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    相关资源
    最近更新 更多