При использовании EF для случая обновления из запроса на MSSQL 2008
возникает проблема с производительностью и блокировкой. Поэтому я установил уровень изоляции транзакций ReadUncommitted, надеясь решить эту проблему, вот так:
До
using (MyEntities db = new MyEntities())
{
// large dataset
var data = from _Contact in db.Contact where _Contact.MemberId == 13 select _Contact;
for (var item in data)
item.Flag = 0;
// Probably db lock
db.SaveChanges();
}
После
using (var scope =
new TransactionScope(TransactionScopeOption.RequiresNew,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
using (MyEntities db = new MyEntities())
{
// large dataset but with NOLOCK
var data = from _Contact in db.Contact where _Contact.MemberId == 13 select _Contact;
for (var item in data)
item.Flag = 0;
// Try avoid db lock
db.SaveChanges();
}
}
Мы используем SQL profiler
для трассировки. Тем не менее, эти сценарии приведены в порядок (Ожидайте чтение-неподтвержденное для 1-го сценария.)
Аудит входа
set transaction isolation level read committed
SP:StmtStarting
SELECT
[Extent1].[ContactId] AS [ContactId],
[Extent1].[MemberId] AS [MemberId],
FROM [dbo].[Contact] AS [Extent1]
WHERE [Extent1].[MemberId] = @p__linq__0
Аудит входа
set transaction isolation level read uncommitted
Хотя я мог бы повторно отправить этот запрос и сделать его в правильном порядке (покажет read-uncommitted
для следующих запросов, тот же SPID), мне интересно, почему он отправил команду чтения-неподтвержденного после команды чтения-фиксации и как это исправить с помощью используя EF и TransactionScope? Спасибо.
TransactionScope.Complete()
. Это не должно влиять на то, что вы видите, и вы все равно не можете откатитьSELECT
, но это неплохо. Также обратите внимание, что если вы не установите уровень изоляции, вы получите тот уровень транзакции, который последний раз применялся к вашему соединению в пуле. Если вы никогда ничего не делаете с уровнем изоляции, это будет значение по умолчаниюread committed
, но в противном случае это может быть что угодно. См. здесь . - person Jeroen Mostert   schedule 20.01.2017