У нашей команды есть проблема, которая проявляется как:
Недопустимый базовый провайдер в EnlistTransaction; Не удается получить доступ к Объект object.Object: 'Transaction'.
который, казалось, появился, как только мы начали использовать TransactionScope для обработки транзакций наших приложений.
Верхняя часть stacktrace фиксируется как:
в System.Data.EntityClient.EntityConnection.EnlistTransaction(транзакция Transaction) в System.Data.Objects.ObjectContext.EnsureConnection() в System.Data.Objects.ObjectContext.ExecuteStoreCommand(String CommandText, Object [] Параметры) в Reconciliation.Models.BillLines.BillLines.Reconciliation.Interfaces.IBillLineEntities.ExecuteStoreCommand(String, Object []) в Reconciliation.Models.Legacy.EntityDbEnvironment.ExecuteOracleSql(String SQL) в EntityDbEnvironment.cs: строка 41
В то же время обновляется журнал MSDTC, который я извлек с помощью здесь:
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:30.269 ;seq=136 ;eventid=TRANSACTION_BEGUN ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"transaction has begun, description :'<NULL>'"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:30.269 ;seq=137 ;eventid=RM_ENLISTED_IN_TRANSACTION ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"resource manager #1002 enlisted as transaction enlistment #1. RM guid = 'defc4277-47a6-4cd9-b092-93a668e2097b'"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=138 ;eventid=RECEIVED_ABORT_REQUEST_FROM_BEGINNER ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"received request to abort the transaction from beginner"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=139 ;eventid=TRANSACTION_ABORTING ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"transaction is aborting"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=140 ;eventid=RM_ISSUED_ABORT ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"abort request issued to resource manager #1002 for transaction enlistment #1"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=141 ;eventid=RM_ACKNOWLEDGED_ABORT ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"received acknowledgement of abort request from the resource manager #1002 for transaction enlistment #1"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=142 ;eventid=TRANSACTION_ABORTED ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"transaction has been aborted"
Как вы видите RECEIVED_ABORT_REQUEST_FROM_BEGINNER секунду после регистрации RM_ENLISTED_IN_TRANSACTION.
Мы не можем понять, откуда этот запрос прерывания, или почему он был поднят. SQL, вызывающий проблему, - это простой SELECT, который мы можем выполнить без проблем через наш клиент базы данных.
Приложение работает большую часть времени, только изредка отображая эту проблему.
Мы используем Oracle 10.2.0.5.0 с Entity Framework.
UPDATE
Следуя советам @Astrotrain, я установил регистрацию в System.Transactions. Полученная окончательная запись буквально отрезана на полпути, хотя:
....
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information">
<TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/TransactionScopeCreated</TraceIdentifier>
<Description>TransactionScope Created</Description>
<AppDomain>BillLineGeneratorUI.exe</AppDomain>
<ExtendedData xmlns="http://schemas.microsoft.com/2004/03/Transactions/TransactionScopeCreatedTraceRecord">
<TraceSource>[Base]
Как вы видите, исключение фактически предотвращает завершение журнала. Что я могу узнать из этого? Любые идеи?