我有一个看起来像这样的集成测试:
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 连接,但由于挂起事务对某些表的明显锁定,它只是超时,尽管读取了未提交的隔离级别。
基本上,我需要能够进行集成测试:
任何想法的人?
答案 0 :(得分:1)
这有效:
using (new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
这不是:
using (var tran = Connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{
必须与TransactionScope
在外部实际连接的事实有关,因此它包装了在其中打开的所有连接,而前一代码打开了事务具有特定的联系。