Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 возможно ли - обойти транзакцию?  [new]
ironmonkey
Member

Откуда:
Сообщений: 3
Доброе время суток.


Ситуация такова:

Есть набор хранимых процедур (много), осуществляющих вставку данных в таблицы БД. Процедуры являются расширением функционала приложения.Записи во всех таблицах имеют primary key. Структура Бд такова (главная вводная задачи, изменить нельзя), что последовательность primary key всех таблиц хранится в отдельной таблице (т.е. перед вставкой записи, необходимо проапдейтить значение последовательности в соответствующей таблице). При такой ситуации - естественно возникают блокировки, приводящие в некоторых случаях к dealock'ам.
Задача - уйти от блокировок (часть процедур выполняется продолжительное время, процедуры выполняются в транзакции, причем присутсвует вложенность процедур, выполнение разных процедур процедур ).
Похожая ситуация рассматривалась в данном топике: https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=453169&hl=clr+%e1%e0%ed%ea%e5 .
Единственная предложенная альтернатива в этом топике - было создание CLR процедуры для генерации (апдейта в моем случае) id. Процедуру CLR создал - все отлично - создается новое соединение и id получается, и апдейтится его значение в соответствующей таблице в новом процессе (spid) - такова была идея (получение и апдейт последовательности в отдельном процессе для избежания блокировок). Но при выполнении CLR в рамках какой либо транзакции выдается ошибка про распределенные транзакции. Далее, пока никаких действий не предпринимал - так как главная идея была обойти общую транзакцию в рамках которой осуществляется вставка данных (для избежания возникновения блокировок).

Подскажите - как с учетом озвученных вводных, решить данную проблему?
Возможно ли решение данной проблемы с помощью CLR ?
В какую сторону копать?


С уважением, ironmonkey.
6 июн 09, 23:47    [7273410]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли - обойти транзакцию?  [new]
ironmonkey
Member

Откуда:
Сообщений: 3
процедур процедур - читать как - совпадает по времени
6 июн 09, 23:53    [7273415]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли - обойти транзакцию?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36805
Решение проблем с дедлоками начинают с анализа графа этих самых дедлоков, структуры таблиц и запросов.
6 июн 09, 23:53    [7273416]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли - обойти транзакцию?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
ironmonkey
Единственная предложенная альтернатива в этом топике - было создание CLR процедуры для генерации (апдейта в моем случае) id. Процедуру CLR создал - все отлично - создается новое соединение и id получается, и апдейтится его значение в соответствующей таблице в новом процессе (spid) - такова была идея (получение и апдейт последовательности в отдельном процессе для избежания блокировок). Но при выполнении CLR в рамках какой либо транзакции выдается ошибка про распределенные транзакции.
"По умолчанию", создаваемые в рамках CLR сборок, соединения принудительно работают в той же транзакции, что и вызывающая эту сборку. Чтобы такой связи не было, строка соединения должна выглядеть примерно так:
new SqlConnection("Integrated Security=true; Initial Catalog=" + DatabaseName.ToString() + 
"; server=" + ServerName.ToString() + "; Application Name=_Generator_for_" + SPID.ToString() +
"; Enlist=false"))
7 июн 09, 00:16    [7273453]     Ответить | Цитировать Сообщить модератору
 Re: возможно ли - обойти транзакцию?  [new]
ironmonkey
Member

Откуда:
Сообщений: 3
Гавриленко Сергей Алексеевич
Решение проблем с дедлоками начинают с анализа графа этих самых дедлоков, структуры таблиц и запросов.

Да, с этого и начали.

DeColo®es
"По умолчанию", создаваемые в рамках CLR сборок, соединения принудительно работают в той же транзакции, что и вызывающая эту сборку. Чтобы такой связи не было, строка соединения должна выглядеть примерно так:
new SqlConnection("Integrated Security=true; Initial Catalog=" + DatabaseName.ToString() + 
"; server=" + ServerName.ToString() + "; Application Name=_Generator_for_" + SPID.ToString() +
"; Enlist=false"))

Спасибо, то что надо.
7 июн 09, 18:22    [7274210]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить