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)
更新:
问题没有完全解决,但其他任何人都应该有进一步的信息.
我感觉重建数据库并重新考虑一些业务功能......
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)
| 归档时间: |
|
| 查看次数: |
29041 次 |
| 最近记录: |