(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()
据我所知,事务没有回滚,表格一直处于锁定状态,直到我针对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;
}
更新:
问题并没有完全解决,但是其他任何人都应该有进一步的信息。
我感觉重建了数据库并重新考虑了一些商业功能......
答案 0 :(得分:14)
我认为TransactionAbortedException实际上是一个超时。如果是这样,您应该发现TransactionAbortedException的InnerException是超时。
你应该能够通过确保transactioncope的超时时间长于命令超时来摆脱它。
尝试将事务范围更改为以下内容:
new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(60))
并在您的上下文中设置显式超时。应该是这样的:
myContext.CommandTimeout = 30; //This is seconds
答案 1 :(得分:0)
我解决了修改“物理文件” machine.config 的问题。
1。您必须本地化文件:
2. 您必须添加以下代码:
var identity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name,"Admin"),
new Claim(ClaimTypes.Role,"Administrator")
, "ApplicationCookie");
var ctx = Request.GetOwinContext();
var authManager = ctx.Authentication;
authManager.SignIn(identity);
return RedirectToAction("Index", "Home", null);
}