Я устраняю неполадки распределенной транзакции с сетью.
Подмножество строк из профиля SQL Server, показывающее, что общий поток находится здесь:
Event Class ObjectID TextData ClientProcessID DatabaseName SPID StartTime TransactionID
TM: Begin Tran completed BEGIN TRANSACTION .Net SqlClient Data Provider 28176 DATABASE_A 65 2018-10-12 15:23:26.627 15818735
SP:StmtCompleted 142882015 SELECT…. .Net SqlClient Data Provider 28176 DATABASE_A 65 2018-10-12 15:23:26.707 15818735
SP:StmtCompleted 974475761 UPDATE…. .Net SqlClient Data Provider 29520 DATABASE_B 68 2018-10-12 15:23:31.037 15818735
Lock:Escalation 2137058649 .Net SqlClient Data Provider 28176 DATABASE_A 65 2018-10-12 15:23:33.510 15818735
SP:StmtCompleted 371328546 UPDATE…. .Net SqlClient Data Provider 28176 DATABASE_A 65 2018-10-12 15:23:33.827 15818735
DTCTransaction {29A26984-00E6-42FA-94BF-39629B84AC89} master 21 2018-10-12 15:23:33.830 15818735
TM: Rollback Tran completed ROLLBACK TRANSACTION .Net SqlClient Data Provider 28176 DATABASE_A 65 2018-10-12 15:23:33.830
Поток на стороне dotnet выглядит следующим образом:
- Клиент вызывает службу A.
- Служба A создает TransactionContext
- Служба A выполняет запросы и обновления DATABASE_A
- Служба A вызывает службуB использует WCF с мыльным вызовом ole-Transactions net.tcp.
- Служба B участвует с [OperationBehavior (TransactionScopeRequired = true, TransactionAutoComplete = true)], а также создает службу TransactionContext
- B выполняет запросы и обновления к DATABASE_B
- Служба B фиксирует, освобождает соединения и возвращает к A
- Служба A выполняет дополнительные запросы и обновляет
- Служба A выдает исключение, откатываясьтранзакция TransactionContext.
При запросе к базам данных в DATABASE_B не может быть найдено никаких новых строк, какТем не менее, sysprocesses в SQL-сервере указывает, что существует открытая транзакция.Глядя на идентификатор транзакции из сеанса Profiler, кажется, что все операции находятся в одной транзакции.Похоже, DTC участвует.Я удивлен, что не могу найти это раньше, ты.Откат выглядит как происходящий на DATABASE_A, разве не должно быть строки для отката на DATABASE_B?
Если я убиваю процесс, в Profiler ничего дополнительного не происходит, но в sysprocesses open_transaction возвращается к 0.
Почему это происходит?