У меня есть обычная программа, которая обновляет мою сущность. Обновление включает около 6 разных таблиц. Все команды выполняются в транзакции.Как избежать этих взаимоблокировок?
Недавно мне нужно было добавить код в процедуру, которая обращается к таблице поиска из базы данных. Код поиска уже существовал в другом бизнес-объекте, поэтому я использовал этот бизнес-объект. Например:
Using tr As DbTransaction = myConnection.BeginTransaction()
ExecuteCommand1(tr)
ExecuteCommand2(tr)
If myLookupTable.GetLookupTable().FindById(id).HasFlagSet Then
ExecuteCommand3(tr)
End If
End Using
Однако бизнес-объект поисковой таблицы зависает/блокируется. Я думаю, это связано с тем, что у него нет ссылки на транзакцию, используемую исходной программой.
После выполнения некоторых исследований я попытался поместить логику таблицы поиска в свою собственную транзакцию, установив IsolationLevel
в ReadUncommitted
. Это дало мне результаты, которые я хотел. Однако, после дальнейших исследований, я сейчас угадываюсь, если я это правильно осуществил.
Предполагая, что ссылка на активную транзакцию недоступна для моего объекта таблицы поиска, то, что я описал, считается лучшей практикой? Я чувствую, что, возможно, что-то не хватает.
Выполняет ли command1 или command2 что-то с помощью поисковой системы? –
Нет, они этого не делают. Они даже не читают. Однако они работают с таблицами, которые имеют FK для таблицы поиска.Ничто из этого не интуитивно не предполагает проблему блокировки для меня. –