Якщо при виконанні розподіленої транзакції з 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). Знадобився, мабуть, не тільки повернення сторінок даних "назад" шляхом відкату, а й відновлення частини сторінок "вперед" по журналу з якогось моменту.
В результаті база заробила, розподілена транзакція відкотилася, журнал усёкся.