mysql 锁 启动失败_mysql-dbupdateException('尝试获取锁时发现死锁;尝试重新启动事务')...

我在.NET核心中有一个MVC应用程序使用MySQL。我有一个下载功能,通过它可以传递ID来下载文件。然而,错误不断发生,并且似乎不知怎么地,应用程序在服务器上的响应变得不那么灵敏,就好像它被回收了一样。下面的代码显示了负责下载文件的部分。我正在使用TransactionScope确保下载计数器已正确更新。我得到的错误与死锁有关。是否有可能有人指出问题所在?

using (var context = new MyDbContext())

using (TransactionScope scope = new TransactionScope())

{

ProjectDownload download = context.ProjectDownload.Include(pd => pd.Project).Where(d => d.Id == downloadId).FirstOrDefault();

if (download == null) throw new InvalidOperationException("Cannot find ProjectDownload.Id");

download.DownloadCounter++;

download.Project.DownloadCounter++;

try

{

context.SaveChanges();

scope.Complete();

return (ProjectDownloadModel)download;

}

catch (DbUpdateException ex){

throw;

}

}

还尝试将以前的代码更改为:

using (var context = new MyDbContext())

using (TransactionScope scope = new TransactionScope())

{

ProjectDownload download = context.ProjectDownload.Where(d => d.Id == downloadId).FirstOrDefault();

download.DownloadCounter++;

Project proj = context.Project.Where(p => p.ProjectDownload.Any(pd => pd.Id == downloadId)).FirstOrDefault();

proj.DownloadCounter++;

...

出现以下错误:

Exception has occurred: CLR/MySql.Data.MySqlClient.MySqlException

An exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code: 'Deadlock found when trying to get lock; try restarting transaction'

at MySql.Data.MySqlClient.MySqlStream.ReadPacket()

at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)

at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)

at MySql.Data.MySqlClient.MySqlDataReader.NextResult()

at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)

at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)

at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)

at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer)

at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()

at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()

at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found)

at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ResultEnumerable`1.GetEnumerator()

at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.<_trackentities>d__17`2.MoveNext()

at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()

at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found)

at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)

at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1`1.b__0(QueryContext qc)

at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)

at ProjectProcess.DownloadProject(Int32 downloadId) in C:\Users\Projects\ProjectWebsite\BusinessLogic\ProjectProcess.cs:line 124

at ProjectController.DownloadProject(Int32 downloadID) in C:\Users\Projects\ProjectWebsite\Controllers\ProjectController.cs:line 33

at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)

at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext()

我不明白死锁是怎么发生的,怎么解决的

这个问题的错误信息是"java.sql.SQLException: Deadlock found when trying to get lock; try restarting transaction"。这个错误通常发生在数据库中的并发操作过程中,当两个或更多的事务相互等待对方所持有的资源时发生死锁死锁是一个常见的数据库问题,它会导致某些事务无法继续执行并最终失败。 根据引用的数据库报错日志显示,错误信息中提到了"Lock wait timeout exceeded",这意味着事务在等待的过程中超出了设置的等待时间。这种情况下,通常的解决方法是重启事务或终止事务。 引用提供了一个临时解决方案,即通过手动终止未能提交事务的线程来解决问题。这可以通过使用"kill"命令来终止线程的执行。需要注意的是,终止线程可能会导致未提交的更改丢失,所以在执行此操作之前应仔细考虑。 综上所述,针对这个错误,可以尝试以下几个解决方案: 1. 重新启动事务:根据错误信息中的建议,可以尝试重新启动事务来解决死锁问题。 2. 终止未提交事务的线程:如果有急需处理的业务数据,可以考虑使用"kill"命令终止未能提交事务的线程。 3. 优化数据库设计:死锁问题通常与数据库设计和查询有关。可以通过优化数据库设计、索引和查询来减少死锁的发生。 需要注意的是,不同的情况可能需要不同的解决方法,因此在实际应用中,需要对具体的数据库和代码进行分析来确定最佳的解决方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [生产异常 Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout ...](https://blog.csdn.net/h952520296/article/details/127268930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [解决生产异常 Cause com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException Lock wait timeout ...](https://blog.csdn.net/zhiyikeji/article/details/124766592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值