LINQ и TranscationScope не работают - PullRequest
       43

LINQ и TranscationScope не работают

2 голосов
/ 02 сентября 2010

Я использую оператор выбора LINQ, заключенный в TransactionScope (для изменения блокировки), но, согласно 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 покажет BatchStarting и BatchComplete для моего оператора select.Но это показывает 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?Я вижу только начальный уровень изоляции подключения через Audit Login.«Обновление» не отображается, чтобы показать, что оно было изменено или что каждый уровень изоляции использует каждый запрос.

Любая помощь была бы замечательной!

Также этот код выполняется в WCF (3.5) служба подключения к SQL Server 2008

1 Ответ

1 голос
/ 02 сентября 2010

ОБНОВЛЕНО:

Попробуйте что-то вроде этого, чтобы проверить уровень изоляции:

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

...