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

Откуда:
Сообщений: 60
Я не настоящий сварщик, поэтому вопросы возможно будут дилетантские.
Есть интеграционный блок учетной программы на 1С и учетной программы на плюсах (легаси). Обе программы под MSSQL (сервера разные). 1С пишет данные во вторую базу через ADO. Данные обычно затрагивают много связанных таблиц, запись выполняется в основном с помощью хранимых процедур второй базы (которые реализуют бизнес-логику второй программы).
Основная схема такая:
- создается соединение
- посылается BEGIN TRANSACTION
- поочередно посылаются разные запросы на чтение и запись, в том числе с помощью вызова хранимых процедур второй программы
- посылается COMMIT TRANSACTION
- соединение явно не закрывается (может это имеет какое-то значение). По-идее оно закрывается неявно при выходе из scope, где оно создавалось (практически сразу после коммита).
Все это нормально работало долгое время и тут по непонятным причинам начались "затыки" производительности.
Типовая картина при этом - монитор активности (MSSQL 2014) показывает очередь задач и цепочку взаимоблокировок (транзакций из 1С и "родных" транзакций программы вперемешку, где в колонке "Главная причина блокировки" единичка стоит напротив процесса из 1С выполняющего в этот момент единственный оператор - COMMIT TRANSACTION. При этом во всех остальных информационных колонках - "по нулям". Типа ничего его "не держит", никакого времени ожидания, никаких типов ожидания, никаких ресурсов - ничего.
Я не совсем понимаю, что это означает и в какую сторону копать.
По моим наивным представлениям коммит уже ничего блокировать не должен. Блокировки должны были возникать на операторах внутри транзакции.
Иногда причиной блокировок отображается выполнение хранимки, которая выполняет просто чтение одной строки из одной таблицы по кластерному индексу - тоже не понимаю, как это может быть...
24 окт 18, 10:00    [21713083]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
Чудес не бывает.
Ищите где у вас в блокирующей сессии остается незавершенная транзакция.
24 окт 18, 11:51    [21713257]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
fisher
Member

Откуда:
Сообщений: 60
invm, Я знаю, что чудес не бывает.
Просто приведите мне понятный пример воспроизводимого сценария, при котором будет наблюдаться аналогичное поведение.
Потому что я не понимаю, как такое может происходить и что может к этому привести.
Ок, незавершенная транзакция. То есть без COMMIT. Но ведь блокировка-то как раз на коммите!
24 окт 18, 12:05    [21713291]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
fisher
Ок, незавершенная транзакция. То есть без COMMIT. Но ведь блокировка-то как раз на коммите!
Блокировка не на commit'е. commit - последняя выполненная инструкция.
Посмотреть блокировки можно так
select * from sys.dm_tran_locks where session_id = ...
24 окт 18, 12:11    [21713303]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
fisher
Member

Откуда:
Сообщений: 60
invm
Блокировка не на commit'е. commit - последняя выполненная инструкция]

А, дошло. То есть, если коммит был последней операцией, но существует вышестоящая транзакция и она не завершена, то пока соединение открыто - будет такая картина?
24 окт 18, 12:16    [21713318]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1367
fisher,

то пока соединение открыто - будет такая картина?

пока транзикция открыта
24 окт 18, 12:19    [21713327]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
fisher
Member

Откуда:
Сообщений: 60
Последний глупый вопрос.
Закрытие соединения с БД откатит незавершенную транзакцию или зафиксирует?
25 окт 18, 10:11    [21714544]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
fisher
Закрытие соединения с БД откатит незавершенную транзакцию или зафиксирует?
Откатит
25 окт 18, 10:20    [21714552]     Ответить | Цитировать Сообщить модератору
 Re: Как оператор COMMIT может быть источником блокировок?  [new]
fisher
Member

Откуда:
Сообщений: 60
Спасибо
25 окт 18, 10:47    [21714570]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить