Привет, я использую первый подход Entity Framework 4.1. У меня есть класс MyContainer
, который наследует DBContext
.Сделка транзакций и DBContext
У меня есть процесс, который имеет 7 шагов на каждом шаге, обращается ко многим методам репозитория (около 60). Этот процесс выполняется автоматически или зависит от бизнес-логики и требований пользователя. Теперь для точки зрения производительности для автоматического процесса я создал контекст, то есть объект MyContainer
один раз, и передал его всем методам и удалил его в конце процесса, а его работа прекратилась и улучшила производительность. Но когда этот процесс выполняется, то одни и те же методы выполненный и контейнер создается и размещается в самом методе. например, ниже, но это всего лишь приблизительный код.
public bool UpdateProcess(Process process, MyContainer container = null)
{
bool disposeContainer = false;
if (container == null)
{
container = new MyContainer();
disposeContainer = true;
}
var result = SaveProcess(container, process);
container.SaveChanges();
if (disposeContainer)
container.Dispose();
return result;
}
Для автоматических операций процесса создается в начале процесса и закончился в конце процесса, и для ручной транзакции создаются на BLL в методе, который называется в соответствии с действием пользователя на пользовательском интерфейсе. Теперь предположим, что мой автоматический процесс запущен, и одновременно пользователь сделал какое-то действие по ui. Я получаю исключение. "Transaction (Process ID 65)
был заблокирован с блокировкой ресурсов с другим процессом и был выбран «Когда метод UpdateProcess() вызывается вместе как из ручного, так и автоматического процесса, я получить его на контейнере.SaveChanges().
Любая помощь будет принята с благодарностью.
Если я создать область транзакции в этом хранилище метод как
public bool UpdateProcess(Process process, MyContainer container = null)
{ bool disposeContainer = false;
if (container == null)
{
container = new MyContainer();
disposeContainer = true;
}
using(var trans=new TransactionScop(TransactionScopeOption.RequiresNew))
{
var result = SaveProcess(container, process);
container.SaveChanges();
trans.Complete();
}
if (disposeContainer)
container.Dispose();
return result;
}
Он отлично работает. Однако я не хочу создавать транзакцию в репозитории, поскольку транзакции уже были сделаны в bll.
Любая помощь будет опробована.
Все работает нормально, если я создаю контейнер и контейнер для автоматического процесса в каждом методе, а не создаю контейнер в начале процесса и удаляю его в конце процесса. – ethicallogics
Я связываю определение [Тупик] (http://en.wikipedia.org/wiki/Deadlock), извинения, если он лишний. –
спасибо за ур усилия bt это не помогает моей проблеме. – ethicallogics