草庐IT

c# - TransactionScope TransactionAborted 异常 - 事务未回滚。应该吗?

coder 2024-05-20 原文

(SQL 服务器 2008) 如果在 TransactionScope (.Complete()) 中发生事务超时错误,您是否希望事务回滚?

更新:
错误实际上是在右大括号中抛出的(即 .Dispose()),而不是 .Complete()。完整错误是:

The transaction has aborted. System.Transactions.TransactionAbortedException TransactionAbortedException System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout
   --- End of inner exception stack trace ---
   at System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction tx, Boolean asyncCommit, AsyncCallback asyncCallback, Object asyncState)
   at System.Transactions.CommittableTransaction.Commit()
   at System.Transactions.TransactionScope.InternalDispose()
   at System.Transactions.TransactionScope.Dispose()

据我所知,事务没有回滚并且表一直处于锁定状态,直到我对 SPID/session_id 发出 KILL。

我使用 DBCC OPENTRAN 获取最早的事务,然后将其杀死。 我已尝试使用 KILL WITH STATUS 但收到一条消息,指出没有任何状态可用,因为没有任何内容被回滚。 sys.dm_exec_sessions 中 SPID/session_id 的状态是“ sleep ”。代码片段:

try
{            
    using (var transaction = new TransactionScope())
    {
        LOTS OF WORK CARRIED OUT WITH LINQ ENTITIES/SubmitChanges() etc.
        transaction.Complete();  //Transaction timeout
    }
    return result;
}
catch (Exception ex)
{
    logger.ErrorException(ex.Message, ex);
    result.Fail(ex.Message);
    return result;
}

更新:
问题并未完全解决,但如果其他人遇到此问题,请提供更多信息。

  1. 我正在使用 LINQ to SQL 并在事务范围内调用 context.SubmitChanges()。我正在执行大量插入操作。 SQL Server 事件探查器指示为每个插入发出一个单独的 INSERT 语句。
  2. 在开发中,如果我在调用 SubmitChanges() 之前让线程休眠 60 秒(默认 TransactionScope 超时为 60 秒),那么在调用 TransactionScope.Complete() 时我会得到一个不同的错误(该操作对状态无效交易。)。
  3. 如果我在 .SubmitChages() 之后和 .Complete() 之前睡了 60 秒,那么我得到 '事务已中止 - System.TimeoutException:事务超时'
  4. 但是请注意,在我的开发机器上,使用 DBCC opentran 时未发现打开的事务 - 这是您所期望的,因为您期望事务回滚。
  5. 如果我随后将此问题底部的代码(抱歉无法让网站将其插入此处)添加到我的配置文件中,这将 TransactionScope 超时增加到 2 分钟,事情将再次开始工作(研究表明如果这不起作用,machine.config 中可能有一个低于此优先级的设置)。
  6. 虽然这将阻止事务中止,但由于更新的性质,这确实意味着锁定核心业务表可能长达 2 分钟,因此使用默认 SqlCommand 超时 30 秒的其他选择命令将超时。不理想,但总比坐在那里并完全阻止应用程序的公开交易要好。
  7. 几天前,我们发布了一个灾难性版本,这意味着我们在升级过程中用完了磁盘空间 (!),因此我们最终使用了收缩数据库功能,这显然会在您使用后导致性能问题。
  8. 我感觉要重建数据库并重新考虑一些业务功能......

最佳答案

我认为 TransactionAbortedException 实际上是一个超时。如果是这样,您应该会发现 TransactionAbortedException 的 InnerException 是超时。

您应该能够通过确保事务作用域的超时时间长于命令超时时间来摆脱它。

尝试将事务范围更改为如下内容:

new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(60))

并且还在您的上下文中设置一个明确的超时。应该是这样的:

myContext.CommandTimeout = 30; //This is seconds

关于c# - TransactionScope TransactionAborted 异常 - 事务未回滚。应该吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7006806/

有关c# - TransactionScope TransactionAborted 异常 - 事务未回滚。应该吗?的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  3. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐