0

Я вижу много людей в моей компании делают это:Использование TransactionScope для выполнения выбора

var transactionOptions = new System.Transactions.TransactionOptions(); 
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; 

using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions)) 
{ 
    try 
    { 
     using (DefaultContext ctx = new DefaultContext()) 
     { 
      return ctx.Item.Where(x => x.State == 1); 
     } 
    } 
    catch (Exception err) 
    { 
     throw err; 
    } 
    finally 
    { 
     transactionScope.Complete(); 
    } 
} 

мне действительно нужно открыть сделку к Выбрать и вызвать метод Complete() после того, как я совсем не думал что это было просто для модификации данных ...

Кто-то может объяснить мне, если это правильно? Это хорошая или плохая оценка? Разве это не нужно?

благодаря

+1

Это кажется совершенно ненужным. Он может работать быстро, но я бы не стал накладными. Я использую только ограниченные txns со вставками и обновлениями. Я вижу, что это задает 'IsolationLevel'' ReadUncommitted'. Они могут делать это для эффекта NOLOCK, который обеспечивает. –

+1

'ReadUncommitted' разрешает грязные чтения, то есть вы можете видеть данные из незавершенных запросов в ваших чтениях (см. Https://stackoverflow.com/questions/2471055/why-use-a-read-uncommitted-isolation-level), который * не * по умолчанию, но конструкция 'catch/throw' совершенно не нужна. –

+1

Вы спросили кого-нибудь в вашей компании, почему они это делают? ;) Я согласен с @R. Ричардс, мне кажется, что единственная причина для этого - использовать уровень изоляции Read Uncommitted. Это говорит о том, что в какой-то момент (или в какой-то момент) возникла проблема с блокировкой, которая препятствует применению приложения, так что ReadUncommitted использовался, чтобы избежать блокировки чтения. ИМО, это довольно большое изменение доступа к данным (для использования по всем направлениям), поэтому я надеюсь, что кто-то узнает всю историю. Или, возможно, один человек сделал это один раз, и теперь это вопрос с копией/вставкой. –

ответ

2

Так что область применения транзакций будет полезно, если вы делаете много вещей с базой данных. Скажите, что вы изменяете 3 таблицы. Вы изменяете таблицу 1, таблицу 2, но затем, когда вы пытаетесь изменить таблицу 3, она терпит неудачу. Вы не хотите, чтобы изменения, внесенные в таблицы 1 и 2, сохранялись, если третий не удалось. Здесь вы переносите его в область транзакции, потому что, если есть ошибка, все эти изменения возвращаются (или, скорее, не принимают), и вам не нужно беспокоиться об этом.

Вы можете прочитать больше here.

Обертка запроса в области транзакции только для получения данных, однако ... Я не вижу никакой пользы. Вы правы, нет манипуляций с данными, поэтому на самом деле не обязательно быть областью транзакций. Я полагаю, что некоторые из ваших коллег просто видели, как кто-то другой использовал их, и решил, что было бы неплохо, если бы они тоже это сделали.

Еще одна странность заключается в том, что они завершают транзакционную область в конечном итоге. Если возникла ошибка, вы, вероятно, не захотите завершить транзакцию.

+0

Вы правы. Они просто копируют и проходят транзакцию для каждого блока кода в проекте ... «У них не было времени спросить, почему». Ваш ответ был очень полезным, мужик. Благодаря! –