Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Ребята, добрый день!

Наверняка эта проблема уже рассматривалась в одном из здешних форумов, но все же напишу еще раз.
Есть в БД 2 таблицы, в которых регулярно (с большой частотой) обновляются данные путем использования команды UPDATE (под пользователем №1).
Из многопользовательского клиентского приложения делается стандартный запрос на выборку (SELECT) к этой БД. Процедура выборки стандартная, она подсасывает данные из этих двух таблиц, пересчитывает их и выдает в приложении.

Так вот возникает проблема, описанная в теме данного форума, соответственно не всегда, но с достаточной частотой

Уважаемые гуру БД, будьте любезны помочь разобраться с данной ситуевиной
26 дек 13, 11:47    [15349130]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Ну если вы таки прочли форум,то скорее всего знаете,что обычно к такому вопросу просят
1. DDL
2. Граф дделока

Без 1 и 2 ето гадание на кофейной гуще
26 дек 13, 12:02    [15349237]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Maxx,
спасибо что откликнулся!
будь добр, подскажи где я это могу взять, просто базами пользуюсь относительно недавно и кроме создания запросов и таблиц практически ничего не знаю
26 дек 13, 12:08    [15349274]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
нет, а вообще, может я и не прав, но задачу усложнять не надо дополнительными документами, ддл и графами ддлоков (в Лог файле этой БД никаких пометок об ошибке нет).
Суть в том, что когда я вызываю хранимую процедуру для выборки данных, она не может прочитать эти данные в виду того, что в таблице из которой она их берет происходит обновление этих данных и соответственно транзакция выборки блокируется (если я использую NOLOCK, то эта блокировка в какой-то степени пропадает (но как я понимаю это не совсем правильное решение данной проблемы))
Так вот и хочу знать, может нужно создать какой-нибудь индекс, триггер, доп ключ (слова берутся произвольно) или что-то еще, а может в настройках БД выбрать какую-нибудь спец опцию, чтобы данные и обновлялись регулярно и просматривать их в программном коде можно было своевременно и без лишних задержек?!
спасибо
26 дек 13, 12:40    [15349476]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
может попробуете использовать read commited snapshot ?
26 дек 13, 13:15    [15349732]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
R.Rollen,

Хотя Ваша задача и имеет общий характер, но решается конкретно для вашего случая.
Хотите конкретный ответ - присылайта DDL и граф дедлока.
Хотите общий ответ:

Минимизация взаимоблокировок
26 дек 13, 13:15    [15349734]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
AnyKey45
Member

Откуда: Ekaterinburg-Moscow-EU
Сообщений: 219
R.Rollen,

можно поставить базе уровень изоляции snapshot(7 раз подумав), но мне кажеться это решение сопоставимо с используемым NOLOCK
26 дек 13, 13:15    [15349735]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Jovanny,

ок, как я понял мне надо включить
dbcc traceon (1204)
dbcc traceon (3605)

и ждать в файле ERRORLOG сообщения с ключевым словом deadlock, верно?

после этих процедур я сделал чтобы в моем приложении возникла блокировка транзакции, но файлЛога попрежнему ничего о дедлоке не пишет
26 дек 13, 13:24    [15349793]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
по изоляции -
спасибо ребята за совет, поробую так поступить
26 дек 13, 13:33    [15349858]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
R.Rollen
Jovanny,

ок, как я понял мне надо включить
dbcc traceon (1204)
dbcc traceon (3605)

и ждать в файле ERRORLOG сообщения с ключевым словом deadlock, верно?

после этих процедур я сделал чтобы в моем приложении возникла блокировка транзакции, но файлЛога попрежнему ничего о дедлоке не пишет

вы наверное их неправильно включили
http://technet.microsoft.com/ru-ru/library/ms188396.aspx
26 дек 13, 13:33    [15349861]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Мистер Хенки,

спасибо за советы и хотел бы задать еще один (может глупый, но все же) вопрос (просто страшновато в системной таблице что-то менять).

аналог моей БД у нас на сервере уже имеется и для него в sys.databases есть столбцы (видимо как раз специально и настроенные для снепшота) различающиеся от моих, а именно snapshot_isolation_state, snapshot_isolation_state_desc.
Будьте любезны, каким образом я сейчас могу поменять их значения, соответственно snapshot_isolation_state = 1, snapshot_isolation_state_desc = ON?
26 дек 13, 13:51    [15349995]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
ВСЕ, вопрос закрыт!
спасибо всем огромное!
26 дек 13, 13:54    [15350011]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
invm
Member

Откуда: Москва
Сообщений: 9723
R.Rollen,

Дедлоки проще всего отмониторить профайлером.
В системных таблицах ничего менять не нужно, да и все равно не получится.
Для начала включите только RCSI:
alter database МояБД set read_committed_snapshot on;
26 дек 13, 13:55    [15350025]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
invm,

ок, спасибо
26 дек 13, 13:56    [15350034]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
R.Rollen
Мистер Хенки,

спасибо за советы и хотел бы задать еще один (может глупый, но все же) вопрос (просто страшновато в системной таблице что-то менять).

аналог моей БД у нас на сервере уже имеется и для него в sys.databases есть столбцы (видимо как раз специально и настроенные для снепшота) различающиеся от моих, а именно snapshot_isolation_state, snapshot_isolation_state_desc.
Будьте любезны, каким образом я сейчас могу поменять их значения, соответственно snapshot_isolation_state = 1, snapshot_isolation_state_desc = ON?

вот тут неплохо написано про включение изоляции снапшотом http://technet.microsoft.com/ru-ru/library/ms175095(v=sql.105).aspx
26 дек 13, 13:57    [15350037]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Мистер Хенки,

а подскажи пожалуйста еще одну вещь, одновременное использование NOLOCK и включенного снепшота к замедлению выполнения запроса не приведет? ли лучше NOLOCK поубирать?
26 дек 13, 14:21    [15350232]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
R.Rollen
Мистер Хенки,

а подскажи пожалуйста еще одну вещь, одновременное использование NOLOCK и включенного снепшота к замедлению выполнения запроса не приведет? ли лучше NOLOCK поубирать?

А чем вас NOLOCK не устраивал, зачем вы снапшот включили?
26 дек 13, 14:27    [15350297]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Мистер Хенки,

ну просто со снепшота как-то централизовано, настроил в БД и все, а НОЛОКИ в каждую новую процедуру (завязанную на частообновляемых таблицах) пришлось бы пихать.

меня то в принципе все устраивало, просто я в этом деле БАОБАБ и у вас интересовался как да что
26 дек 13, 14:31    [15350327]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
R.Rollen
Мистер Хенки,

ну просто со снепшота как-то централизовано, настроил в БД и все, а НОЛОКИ в каждую новую процедуру (завязанную на частообновляемых таблицах) пришлось бы пихать.

меня то в принципе все устраивало, просто я в этом деле БАОБАБ и у вас интересовался как да что

Вы бы почитали про уровни изоляции, их всего 6, чтоб получше понимать что вы делаете. А так nolock - это задает для запроса уровень read uncommited .
26 дек 13, 14:41    [15350414]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
R.Rollen
Member

Откуда:
Сообщений: 21
Мистер Хенки,

учту, спасибо за подмогу
26 дек 13, 14:43    [15350435]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
PaulWist
Member

Откуда:
Сообщений: 2264
Jovanny
R.Rollen,

Хотя Ваша задача и имеет общий характер, но решается конкретно для вашего случая.
Хотите конкретный ответ - присылайта DDL и граф дедлока.
Хотите общий ответ:

Минимизация взаимоблокировок


По ссылке есть такие слова:

автор
Уменьшение размера транзакций и помещение их в один пакет

Помещение транзакций в один пакет сокращает объемы передачи данных по сети во время транзакции, уменьшая возможные задержки при завершении транзакций и снятии блокировок.


Собственно вопрос, что подразумевается под словами Помещение транзакций в один пакет ?

Правильно ли я понимаю, что тут имеется в виду ситуация, когда необходимо выполнить 2 ХП (например модифицировать документ Мастер-Детали), то необходимо их выполнить через третью ХП, которая в своём теле сделает вызов первых двух?
27 дек 13, 10:28    [15353723]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Glory
Member

Откуда:
Сообщений: 104751
PaulWist
Правильно ли я понимаю, что тут имеется в виду ситуация, когда необходимо выполнить 2 ХП (например модифицировать документ Мастер-Детали), то необходимо их выполнить через третью ХП, которая в своём теле сделает вызов первых двух?

ХП уже является отдельным пакетом.
А вы два пакета хотите еще в третий поместить.
27 дек 13, 10:31    [15353734]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
PaulWist
Member

Откуда:
Сообщений: 2264
Glory
PaulWist
Правильно ли я понимаю, что тут имеется в виду ситуация, когда необходимо выполнить 2 ХП (например модифицировать документ Мастер-Детали), то необходимо их выполнить через третью ХП, которая в своём теле сделает вызов первых двух?

ХП уже является отдельным пакетом.
А вы два пакета хотите еще в третий поместить.


2Glory

Уточняем вопрос :)

Как надо поступить если имеем 2 ХП, что бы выполнить рекомендации MS "Помещение транзакций в один пакет" ?

Слить код из 2-х ХП в одну?
27 дек 13, 10:44    [15353823]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
Glory
Member

Откуда:
Сообщений: 104751
PaulWist
Слить код из 2-х ХП в одну?

Да
27 дек 13, 10:46    [15353838]     Ответить | Цитировать Сообщить модератору
 Re: Транзакция(идентификатор процесса ...) вызвала взаимоблокировку ресурсов блокировка  [new]
PaulWist
Member

Откуда:
Сообщений: 2264
Glory
PaulWist
Слить код из 2-х ХП в одну?

Да


ОК, ...

Вторая часть вопроса:

автор
Помещение транзакций в один пакет сокращает объемы передачи данных по сети во время транзакции


Что означает фраза: "сокращает объемы передачи данных по сети во время транзакции" в чём это сокращение выражается, для примера с 2-мя ХП против, надо полагать сокращение составит в 2 раза, поскольку в первом случае сервер вернёт ДВА статуса выполнения, а во втором случае один, я правильно понимаю?
27 дек 13, 10:52    [15353871]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить