Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
RIPer Member Откуда: Сообщений: 26 |
Есть 2 процедурки, это отчеты. Характер процедурок одинаковый - запуск процедуры пересчета документов - это реальный пересчет реальных документов с записью данных в реальные таблицы. - выборка данных во времянки - Изменение данных во времянках - результирующий вывод. Процедуры могут выполняться достаточно долго (до 10 мин.), так вот, хотелось бы чтобы на время выполнения этих процедур они не блокировали бы таблицы. Пробовал хинты nolock и SET TRANSACTION ISOLATION LEVEL SNAPSHOT вначале процедуры, не помогло. В такие вопросы никогда не влазил, чтение документации в голове оставило много каши. Использую MSSQL Server 2008R2. Как реализовать такое и на что нужно обратить внимание? |
1 окт 14, 17:09 [16645951] Ответить | Цитировать Сообщить модератору |
daw Member Откуда: Муром -> Москва Сообщений: 7381 |
при изменении данных блокироваться изменяемые данные будут - от этого вы никак не избавитесь. а SET TRANSACTION ISOLATION LEVEL SNAPSHOT - это в _читающих_ коннектах надо делать. тогда блокировка не будет мешать чтению. |
||
1 окт 14, 17:21 [16646038] Ответить | Цитировать Сообщить модератору |
хмхмхм
Guest |
А они их действительно блокируют? У вас же в процедурах только:
Время этих выборок какое? Какие накладываются блокировку на таблицу (какой уровень изоляции транзакции включен, какие хинты в запросах выборок)? |
||||
1 окт 14, 17:27 [16646090] Ответить | Цитировать Сообщить модератору |
RIPer Member Откуда: Сообщений: 26 |
то есть - запуск процедуры пересчета документов - это реальный пересчет реальных документов с записью данных в реальные таблицы нужно выносить из процедуры, или разделить процедуру на 2 транзакции с разным уровнем изоляции? Изменение то как раз делается не долго и не всегда. Один селект будет всегда блокировать другой если они по одной таблице? |
||||
1 окт 14, 17:32 [16646124] Ответить | Цитировать Сообщить модератору |
RIPer Member Откуда: Сообщений: 26 |
Блокируют, даже delete по таблице ждет окончания процедуры. По умолчанию в базе стоит READ COMMITTED, пробовал и с nolock и без него. А есть ли какой нибудь лог где можно увидеть кто что блокирует? |
||||||
1 окт 14, 17:37 [16646165] Ответить | Цитировать Сообщить модератору |
daw Member Откуда: Муром -> Москва Сообщений: 7381 |
ну, раз не долго и не всегда, то можно вынести, тогда. и запускать только когда надо, а не каждый раз. "разделить процедуру на 2 транзакции с разным уровнем изоляции" смысла нет особого - разве что эти ваши 2 процедурки друг другу меньше будут мешать при одновременном запуске. один селект блокировать другой не будет. |
||
1 окт 14, 17:38 [16646172] Ответить | Цитировать Сообщить модератору |
RIPer Member Откуда: Сообщений: 26 |
В процедуре отчета проверяется нужно ли делать пересчет, и если нужно то он запускается, хотя пересчет может запускаться и из другого места. Но процедура отчета блокируют другую, похожую, или другой запрос, даже если не запускался пересчет. |
||
1 окт 14, 17:47 [16646247] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8488 |
Если грязное чтение не помогает, значит Вы недоговариваете, того, что процедура выполняет изменение данных в длиииинной транзакции. |
1 окт 14, 17:52 [16646275] Ответить | Цитировать Сообщить модератору |
RIPer Member Откуда: Сообщений: 26 |
Хм, надо будет попробовать исключить вызов пересчета... Вот только что лучше оставить nolock или snapshot? |
||
1 окт 14, 17:57 [16646329] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8488 |
Снапшот - хорошо, но для него требуется богатырская производительность tempdb :) readuncommitted может прочесть данные, которые затем будут выброшены или будут добавлены после получения первых данных. Смотрите по задаче. |
1 окт 14, 18:07 [16646390] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4822 |
Надо использовать эти уровни изоляции в процедурах, которые читают. Что касается вставки, то у вас наверняка есть возможность минимизировать время блокировки таблицы (соберите сначала все, что нужно во временную таблицу, а только потом начинайте операцию на критической таблице). Также может вам рассмотреть варианты обновления частями, порциями или инкрементально. Посмотрите, что такое Lock Escalation |
||
1 окт 14, 18:41 [16646621] Ответить | Цитировать Сообщить модератору |
RIPer Member Откуда: Сообщений: 26 |
В том то и дело что такая минимизация есть, в процедуре расчета в конце есть транзакция, которая меняет реальные данные, тупо delete одно, insert другое. Но если процедура отчета длится 1000 сек и нет никаких хинтов и изменения уровня изоляции, то другая процедура отчета, которая берет данные их тех же таблиц вместо обычных 60 сек выполняется 500 и в процессах показывается что она блокируется первой. Хотя транзакция по изменению реальных данных делается достаточно быстро. Отсюда я сделал вывод что блокирует вторую процедурку именно селект из первой. В общем получается гадание на кофейной гуще, все же нужны данные о том кто кого и когда блокирует, чтобы четче понимать в какие моменты процедуры происходит эта блокировка. |
||||
2 окт 14, 09:41 [16648321] Ответить | Цитировать Сообщить модератору |
RIPer Member Откуда: Сообщений: 26 |
Хм, это отчет, и мне все равно что будет с данными потом. И я так понимаю что с readuncommitted все будет быстрее? |
||
2 окт 14, 09:43 [16648328] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |