2

我正在使用包装在 TransactionScope 中的 LINQ select 语句(以更改锁定),但根据 SQL Profiler,它似乎不起作用。我的代码如下所示:

using (var ts = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted} ))
{
   using (myDBDataContext dbPKC = new myDBDataContext(conn))
   {
      ...query...
      ts.Complete();
      return xmlMachine;
   }
}

现在我希望 SQL Profiler 为我的 select 语句显示 BatchStarting 和 BatchComplete。但它显示 RPC:已完成。为什么?当我运行此代码时:

using (SqlConnection conn1 = new SqlConnection())
    {
      conn1.ConnectionString = WebConfigurationManager.ConnectionStrings["myConnectionString"].ToString(); ;
      conn1.Open();
      using (SqlTransaction trans1 = conn1.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
      {
        SqlCommand cmd = new SqlCommand("select * from Machines where pkID = 5");
        cmd.Connection = conn1;
        cmd.Transaction = trans1;
        SqlDataReader reader = cmd.ExecuteReader(); // just execute something
      }
    }

它显示 BatchStarting 和 BatchComplete。为什么 LINQ 似乎没有“看到” TransactionScope?

还有一种方法可以通过 Profiler 确认我的隔离级别是否正确?我只能通过审核登录查看初始连接的隔离级别。不显示“更新”以表明它已更改或每个查询使用的每个隔离级别。

任何帮助都会很棒!

此外,此代码在连接到 SQL Server 2008 的 WCF (3.5) 服务中运行

4

1 回答 1

1

更新:

尝试这样的事情来检查隔离级别:

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options))
{
    //Verify Scope using DBCC USEROPTIONS
    SqlCommand cmd = (SqlCommand)ctxt.Connection.CreateCommand();
    cmd.CommandText = "DBCC USEROPTIONS";
    SqlDataReader r = cmd.ExecuteReader();
    while (r.Read())
    {
        Console.WriteLine(r.GetValue(0) + ":" + r.GetValue(1));
    }
}   

添加:

寻找SET TRANSACTION ISOLATION LEVEL

于 2010-09-02T19:39:05.170 回答