2013-02-11 6 views
2

Нужно предложение для файла Dbml с linq, у нас есть база данных с большим количеством данных. иногда есть блокировка в таблице. Так что нам нужно применить уровень изоляции с чтением uncommined (мы знаем, что это недостаток для этого уровня изоляции) в классе dbml.уровень изоляции в linq to sql, DataContext

у меня есть яблоко ниже код в DBML файл в качестве частичного класса

partial class MainDataContext 
{ 
    public MainDataContext() 
    { 
     base.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); 
    } 
} 

Является ли это надлежащим образом реализовать? или дать какое-либо предложение.

Благодаря

ответ

5

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

Конечно, если вы сделаете это - то теперь ваша работа, чтобы правильно установить соединение, когда вы закончите: LINQ-to-SQL предположит, что вы управляете временем жизни соединения.

Другим вариантом с контекстом данных в LINQ-to-SQL является использование ExecuteQuery<T>(sql, args) метода, который позволяет передавать в собственной сырьевой TSQL - это, очевидно, означает, что вы на самом деле не используя LINQ больше, но это позволяет добавить NOLOCK и т. д. в нескольких местах, где это делает тактический смысл (просто используя контекст данных для материализатора). Это более подробно и позволяет сосредоточиться на высокопроизводительных/высококонкурентных таблицах.

3

Вы можете разместить код, который взаимодействует с db в блоке TransactionScope и установить необходимый уровень изоляции для TransactionScope.

TransactionOptions _transactionOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.Snapshot }; 
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, _transactionOptions)) 
{ 
//your code here 
} 

И, конечно же, принимая это еще один шаг вперед, вы можете инкапсулировать создание TransactionScope в статическом Factory, как метод, так что легче там, где это необходимо и в случае, если вы хотите изменить уровень изоляции там будет одно место, чтобы изменить его. В зависимости от ваших требований выберите то, что лучше для вас.

Смежные вопросы