Лочится таблица Service Broker

Гость 0601
Дата: 01.06.2011 19:37:54
Всем добрый день!

Использую MSSQL2008R2, Service Broker.

В большом количестве процедур запускается вот такая команда:

send on conversation @lv_dialog_handle message type sb_message_type ....

В последнее время часто стали появляться deadlock, которые обнаруживаются и убиваются автоматически, но от этого легче не становится.
Я запустил профайлер с указанием фиксации дедлок-графа и вот что я обнаружил: лочат друг друга 2 транзакции в которых кроме нескольких селектов и send on conversation в конце ничего нет. Далее посмотрел объект который лочится: через HotBt ID на таблицу partitions, а далее на objects и обнаружил там таблицу sysdesend (которая является таблицей, в которую как я понял и сваливаются все сообщения и которую Service Broker читает - в принципе для меня это не так уж и важно).

Вопрос: как мне избавиться от этих deadlock?

Заранее спасибо.
Crimean
Дата: 01.06.2011 20:42:02
добро пожаловать в клуб. опять бесплатный сыр от MS. поскольку таблицы в твоей же базе - работа с ними вносит неразбериху в картину блокировок. избавиться - как от любого дедлока - или вынести за пределы транзакции или согласовать порядок блокировки объектов
Mnior
Дата: 02.06.2011 01:53:27
Гость 0601, выложи граф сразу сюда, чтоб не играть в испорченный телефон. Слишком много нюансов.
Гость 0601
Дата: 02.06.2011 09:14:03
Crimean, спасибо за совет. Наверное, мы все в этой ловушке :)
Mnior, единственное, что пока могу предоставить это визуальный граф (если скажете, что нужно что-то еще - укажите, пожалуйста, как это что-то еще можно получить) - во вложении
Гость 0601
Дата: 02.06.2011 09:14:47
файл не приложился сразу.
Crimean
Дата: 02.06.2011 11:51:19
еще нужно имена объектов разрезолвить. а то мы по ИД как-то еще не научились чужие базы читать :)
Гость 0601
Дата: 02.06.2011 14:01:07
Crimean, если я правильно Вас понял, то вот:
1) слева овал - это sp1, справа овал - это sp2 (определил из object id в хинте при наведении курсором)
2) в прямоугольниках - то, что лочится. Под HotBt ID в таблице partitions кроется объект sys.sysdesend (читается только с DAC) - lock как раз на ней висит.
Mnior
Дата: 02.06.2011 15:49:42
Покажи ещё сами команды (обе!) на которых лочится и вываливается.

send on conversation @lv_dialog_handle message type sb_message_type
sys.sysdesend: Contains a row for each sending endpoint of a Service Broker conversation.

Получается что у вас несколько процессов параллельно обрабатывают один диалог.
Гость 0601
Дата: 02.06.2011 16:06:50
Mnior, да Вы правы - несколько параллельных процессов пишут в один диалог. А разве это запрещено?
Mnior
Дата: 02.06.2011 16:48:59
Гость 0601
А разве это запрещено?
Вам решать, только на проблемы не жалуйтесь. Никто не запрещает забивать гвозди микроск...
И вообще диалог между двумя субъектами, третьего не дано. А Граф на этом можно сделать любой.

Ладно. Мне интересно что за задача такая, что диалог обрабатывается параллельно, и как вы гарантируете целостность и надёжность?