sysprocesses.open_tran с распределенными транзакциями - PullRequest
0 голосов
/ 12 октября 2018

Я устраняю неполадки распределенной транзакции с сетью.

Подмножество строк из профиля 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.

Почему это происходит?

...