Як видалити зависла розподілену транзакцію в ms sql

Якщо при виконанні розподіленої транзакції з Microsoft SQL Server на сервері сталася помилка I / O або сталося відключення сервера / бази даних, тоді транзакція в координатора (DTC) та на інших базах буде відвалений (ROLLBACK), а в постраждалій базі даних на SQL Server може НЕ відкотитися. Це тому, що в результаті відключення / збою, СУБД технічно не могла її відкотити.

Зависла розподілена транзакція буде проявлятися, в тому числі, тим, що в основі не буде обрізатися журнал (TRANSACTION LOG) навіть в режимі відновлення SIMPLE.

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

Як діагностувати зависла розподілену транзакцію?

Ця команда може видати приблизно наступне:

Зверніть увагу на ім'я DTCXact - це означає, що транзакцію ініціював Distributed Transaction Coordinator.

Ок. Дізнавшись SPID, ми можемо дізнатися що за процес працював в транзакції:

Ми можемо його вбити (KILL.). Але не треба цього робити.

Зависла розподілену транзакцію припинення клієнтського процесу не зупинить - вона існує тепер тільки в постраждалій базі даних, сам процес і координатор про неї вже забули.

Як завершити зависла розподілену транзакцію?

Інтернет на питання "ROLLBACK DTCXact" і "DTCXact" видає дурні статті на загальні теми або обговорення без відповіді на питання.

Нещодавно, я використовував такий спосіб - перевести базу в одного користувача режим з відкотом всіх транзакцій:

Переконався, що транзакція відкотилася, і спробував перевести в багатокористувацький:

Правда після цього, як я підозрюю, через логічного ушкодження (яке було не наслідком, а причиною зависла розподіленої транзакції) база увійшла в режим SUSPECT. Довелося її вимкнути (Take Off) і включити (Take On). Знадобився, мабуть, не тільки повернення сторінок даних "назад" шляхом відкату, а й відновлення частини сторінок "вперед" по журналу з якогось моменту.

В результаті база заробила, розподілена транзакція відкотилася, журнал усёкся.