TransactionScope TransactionAborted Exception - 事务未回滚.应该是吗?

MT.*_*MT. 16 c# sql-server transactionscope

(SQL SERVER 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()
Run Code Online (Sandbox Code Playgroud)

据我所知,事务没有回滚,表格保持锁定,直到我对SPID/session_id发出了KILL.

我使用DBCC OPENTRAN获取最早的事务,然后杀死它.我已经尝试了KILL WITH STATUS但是收到一条消息,说明没有任何状态可用,因为没有回滚.sys.dm_exec_sessions中SPID/session_id的状态为"正在休眠".代码段:

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;
}
Run Code Online (Sandbox Code Playgroud)

更新:
问题没有完全解决,但其他任何人都应该有进一步的信息.

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

alu*_*lun 16

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

您应该能够通过确保transactioncope的超时长于命令超时来摆脱它.

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

new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(60))
Run Code Online (Sandbox Code Playgroud)

并在您的上下文中设置显式超时.应该是这样的:

myContext.CommandTimeout = 30; //This is seconds
Run Code Online (Sandbox Code Playgroud)

  • 也许这类似于 http://sankarsan.wordpress.com/2009/02/01/transaction-timeout-in-systemtransactions/ (2认同)