2

Я использую оператор выбора LINQ, завернутый в TransactionScope (для изменения блокировки), но, согласно SQL Profiler, он не работает. Мой код выглядит следующим образом:LINQ и TranscationScope не работают

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 для моего оператора выбора. Но он показывает RPC: Completed. Зачем? когда я запускаю этот код:

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

+0

Почему вы используете область транзакций для запроса? – garik

+0

Ищите УРОВЕНЬ ИЗОЛЯЦИИ SET TRANSACTION – garik

+0

Я использую transactioncope для изменения типа блокировки. Я делаю equiv для оператора выбора nolock. Я использую linq, потому что я делаю инструкцию select и массирую ее в xml в той же строке. (XElement) – BabelFish

ответ

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)); 
    } 
} 

ADDED:

Ищите SET TRANSACTION ISOLATION LEVEL

+0

переключение порядка (экземпляр db, затем транскоп) показывает RPC: Завершено :( – BabelFish

+0

спасибо .. кажется, что transcope работает. Профилировщик должен показать инструкции SP, потому что linq выполняет sql через sq_executesql и отображает инструкции TM для отображения транзакций. Ваш код также помог показать, что уровень изоляции является правильным TEXTSIZE:. -1 язык: us_english DateFormat: MDY DATEFIRST: 7 lock_timeout: -1 quoted_identifier: SET ANSI_NULL_DFLT_ON: SET ANSI_WARNINGS: SET ansi_padding: SET ansi_nulls: SET concat_null_yields_null: SET уровень изоляции: читать незафиксированный – BabelFish

+0

Это приводит к моим следующим вопросам. Этот оператор select блокируется другой транзакцией, которая использует readcommited. почему этот запрос выбора блокируется?два вызова имеют дело с теми же таблицами, но с разными строками. оба вызова имеют большие предложения, если это имеет значение. – BabelFish