首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TransactionScope -底层提供程序在EnlistTransaction上失败。MSDTC被中止

TransactionScope -底层提供程序在EnlistTransaction上失败。MSDTC被中止
EN

Stack Overflow用户
提问于 2013-04-29 16:21:44
回答 4查看 16.8K关注 0票数 15

我们的团队遇到了一个问题,表现为:

基础提供程序在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日志,我使用这里的说明提取该日志

代码语言:javascript
运行
复制
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上设置了日志记录。但是,最后一条条目实际上是半途而废:

代码语言:javascript
运行
复制
....
<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]

如您所见,异常实际上阻止了日志的完成。我能从中学到什么?有什么想法吗?

EN

Stack Overflow用户

发布于 2014-07-17 12:58:17

这也许应该是一个评论,但它太大了。希望能帮上忙。

嵌套事务中最提示的错误之一是:

代码语言:javascript
运行
复制
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对象都已被释放,因为它们是同一事务的一部分。

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16283524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档