Назад | Перейти на главную страницу

Изменить базу данных заблокировано -2

У нас есть база данных, которую мы не можем восстановить, потому что любая изменить базу данных, чтобы перевести ее в режим single_user (или в автономный режим), не удастся, потому что она заблокирована распределенной транзакцией.

sp_lock -2 показывает следующее:

spid    dbid    ObjId   IndId   Type    Resource    Mode    Status
-2         7        0       0    DB                    S     GRANT

Так что явно что-то заблокировано.

exec sp_who2 не показывает соединений для этой базы данных.

select req_transactionUOW
from master..syslockinfo
where req_spid = -2

Ничего не возвращает (кроме обычного 00000000-0000-0000-0000-000000000000)

В координаторе MSDTC нет транзакций, помеченных как «сомнительные». Есть одна активная транзакция, но мы не можем зафиксировать или прервать ее, поскольку она не «вызывает сомнения».

Как нам принудительно снять эту блокировку? Или как отменить эту транзакцию в MSDTC

Оказывается, это ошибка в sql server 2016 и java-приложениях:

https://support.microsoft.com/en-us/help/3145492/fix-xa-transactions-aren-t-cleaned-when-you-exit-a-java-application-in

Для включения исправления необходимо включить флаг трассировки (3924)

Также есть ошибка с этим исправлением, поэтому убедитесь, что sql server обновлен до последней версии CU.

https://support.microsoft.com/en-us/help/4511816/fix-access-violation-occurs-when-you-enable-tf-3924-to-clean-orphaned

и дополнительное исправление для этого исправления
https://support.microsoft.com/en-us/help/4519668/fix-access-violation-occurs-when-you-enable-tf-3924-to-clean-orphaned

После обновления до SP2 CU10 и включения флага трассировки (3924) я больше не мог воспроизвести проблему.