gpt4 book ai didi

c# - 回滚事务时出现异常 - 连接已关闭?

转载 作者:可可西里 更新时间:2023-11-01 09:10:52 25 4
gpt4 key购买 nike

使用 Entity Framework 6.0.0,我在关闭事务时看到异常。

我们一直在对表进行并发更改时遇到问题,所以我将其包装在一个事务中,现在我在回滚时遇到异常。

代码:

public LockInfo getSharedLock(string jobid)
{
using (var myDbContext = new MyDbContext())
{
using (var transaction = myDbContext.Database.BeginTransaction())
{
try
{
this.logger.log("Attempting to get shared lock for {0}", jobid);

var mylocks =
myDbContext.joblocks.Where(j => j.customerid == this.userContext.customerid)
.Where(j => j.jobid == jobid)
.Where(j => j.operatorid == this.userContext.operatorid);

var exclusiveLock = mylocks.FirstOrDefault(
j => j.lockstatus == LockInfo.LockState.Exclusive);
if (exclusiveLock != null)
{
this.logger.log("{0} already had exclusive lock, ignoring", jobid);
return LockInfo.populate(exclusiveLock);
}

var sharedLock = mylocks.FirstOrDefault(
j => j.lockstatus == LockInfo.LockState.Shared);
if (sharedLock != null)
{
this.logger.log("{0} already had shared lock, ignoring", jobid));
sharedLock.lockdt = DateTime.Now;
myDbContext.SaveChanges();

return LockInfo.populate(sharedLock);
}

var joblock = new joblock
{
customerid = this.userContext.customerid,
operatorid = this.userContext.operatorid,
jobid = jobid,
lockstatus = LockInfo.LockState.Shared,
sharedLock.lockdt = DateTime.Now
};

myDbContext.joblocks.Add(joblock);
myDbContext.SaveChanges();
transaction.Commit();

this.logger.log("Obtained shared lock for {0}", jobid);
return LockInfo.populate(joblock);
}
catch (Exception ex)
{
transaction.Rollback();
this.logger.logException(ex, "Exception in getSharedLock(\"{0}\")", jobid);
throw;
}
}
}
}

您可以在上面的代码中看到日志记录。我们也在数据库中启用了日志记录。日志跟踪:

===================
NORMAL TicketLockController.getLock("AK2015818002WL")
===================
SQL Opened connection at 9/22/2015 2:47:49 PM -05:00
===================
SQL Started transaction at 9/22/2015 2:47:49 PM -05:00
===================
NORMAL Attempting to get shared lock for AK2015818002WL
===================
SQL SELECT TOP (1) [Extent1].[customerid] AS [customerid]
,[Extent1].[jobid] AS [jobid]
,[Extent1].[lockdtdate] AS [lockdtdate]
,[Extent1].[lockdttime] AS [lockdttime]
,[Extent1].[operatorid] AS [operatorid]
,[Extent1].[lockstatus] AS [lockstatus]
,[Extent1].[changes] AS [changes]
FROM [dbo].[joblock] AS [Extent1]
WHERE ([Extent1].[customerid] = 'TESTTK')
AND ([Extent1].[jobid] = 'AK2015818002WL')
AND ([Extent1].[operatorid] = 'ADMIN')
AND (N'Exclusive' = [Extent1].[lockstatus])
===================
SQL SELECT TOP (1) [Extent1].[customerid] AS [customerid]
,[Extent1].[jobid] AS [jobid]
,[Extent1].[lockdtdate] AS [lockdtdate]
,[Extent1].[lockdttime] AS [lockdttime]
,[Extent1].[operatorid] AS [operatorid]
,[Extent1].[lockstatus] AS [lockstatus]
,[Extent1].[changes] AS [changes]
FROM [dbo].[joblock] AS [Extent1]
WHERE ([Extent1].[customerid] = 'TESTTK')
AND ([Extent1].[jobid] = 'AK2015818002WL')
AND ([Extent1].[operatorid] = 'ADMIN')
AND (N'Shared' = [Extent1].[lockstatus])
===================
SQL INSERT [dbo].[joblock] (
[customerid]
,[jobid]
,[lockdtdate]
,[lockdttime]
,[operatorid]
,[lockstatus]
,[changes]
)
VALUES (
@0
,@1
,@2
,@3
,@4
,@5
,NULL
)
===================
SQL Closed connection at 9/22/2015 2:47:50 PM -05:00
===================
EXCEPTION Unhandled exception caught: The underlying provider failed on Rollback.
===================
EXCEPTION Inner Exception: Value cannot be null.
Parameter name: connection

两次选择都成功了,然后由于某种原因插入失败了。抛出异常,并且由于某种原因连接在 Rollback() 执行之前关闭。

知道我做错了什么吗?

==== 添加堆栈跟踪 ====

外部异常的堆栈跟踪:

   at System.Data.Entity.Core.EntityClient.EntityTransaction.Rollback()
at korterra.kt_api.Shared.TicketLockWrangler.getSharedLock(String jobid)
at korterra.kt_ws.ApiControllers.Shared.TicketLockController.getSharedLock(TicketLockDTO ticketLockDTO)
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()

内部异常的堆栈跟踪:

   at System.Data.Entity.Utilities.Check.NotNull[T](T value, String parameterName)
at System.Data.Entity.Infrastructure.Interception.DbTransactionInterceptionContext.WithConnection(DbConnection connection)
at System.Data.Entity.Infrastructure.Interception.DbTransactionDispatcher.Rollback(DbTransaction transaction, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.EntityTransaction.Rollback()

最佳答案

在讨论之后,我开始在尝试回滚之前记录异常 - 这揭示了错误。

交易陷入僵局:

Exception in getSharedLock("ticketnumber123456"): An error occurred while updating the entries. See the inner exception for details.

Inner Exception: An error occurred while updating the entries. See the inner exception for details.

Inner Exception: Transaction (Process ID 139) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

根据我的阅读,当您被告知某个事务已成为死锁受害者时,它已经被回滚。也许这就是我们得到异常的原因?

解决方法似乎是要么识别我们何时陷入僵局而不回滚,要么不使用事务,并在我们遇到主键冲突时重试。

关于c# - 回滚事务时出现异常 - 连接已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32728267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com