我们的团队遇到了一个问题,表现为:
基础提供程序在EnlistTransaction上失败;无法访问已释放的object.Object名称:“Transaction”。

当我们开始使用TransactionScope来处理应用程序的事务时,它似乎就出现了。
堆栈跟踪的顶部被捕获为:
(在System.Data.EntityClient.EntityConnection.EnlistTransaction(Transaction事务)在System.Data.Objects.ObjectContext.EnsureConnection() at System.Data.Objects.ObjectContext.ExecuteStoreCommand(String命令文本,在Reconciliation.Models.BillLines.BillLines.Reconciliation.Interfaces.IBillLineEntities.ExecuteStoreCommand(String,Object[](在Reconciliation.Models.BillLines.BillLines.Reconciliation.Interfaces.IBillLineEntities.ExecuteStoreCommand(String,Object[]),在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是一个简单的选择,我们可以通过我们的数据库客户端执行它而不发出任何问题。
应用程序大部分时间都能工作,只是偶尔显示这个问题。
我们在实体框架中使用Oracle 10.2.0.5.0。
更新
根据@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]如您所见,异常实际上阻止了日志的完成。我能从中学到什么?有什么想法吗?
发布于 2014-07-17 12:58:17
这也许应该是一个评论,但它太大了。希望能帮上忙。
嵌套事务中最提示的错误之一是:
using(TransactionScope outerScope = new TransactionScope())
{
// Execute query 1
using(TransactionScope innerScope = new TransactionScope())
{
try
{
// Execute query 2
}
catch (Exception)
{
}
innerScope.Complete();
}
outerScope.Complete();
}现在,如果查询2(位于try/catch块内部)出现错误,那么您将在try/catch块中捕获异常并处理它,但下面是一个提示:当您试图完成事务时,应用程序将在第15行抛出一个ObjectDisposedException。这是因为DTC已经捕获了异常,尽管您已经处理了它,但是TransactionScope对象已经被.Net代码和事务处理回滚了。注意,我说过“object”,这是因为两个TransactionScope对象都已被释放,因为它们是同一事务的一部分。
https://stackoverflow.com/questions/16283524
复制相似问题