C#:如何在MySql回滚中捕获异常 [英] C#: How to catch exception in MySql rollback

查看:340
本文介绍了C#:如何在MySql回滚中捕获异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Entity Framework连接到MySql数据库。一些长时间的查询超时,然后我的应用程序崩溃。在事件查看器中我看到这个例外:

I'm using Entity Framework to connect to a MySql database. Some long queries are timing out and then my application crashes. In event viewer I see this exception:

Application: MyApp.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException
Stack:
at MySql.Data.MySqlClient.NativeDriver.ExecutePacket(MySql.Data.MySqlClient.MySqlPacket)
at MySql.Data.MySqlClient.NativeDriver.SendQuery(MySql.Data.MySqlClient.MySqlPacket)
at MySql.Data.MySqlClient.Driver.SendQuery(MySql.Data.MySqlClient.MySqlPacket)
at MySql.Data.MySqlClient.Statement.ExecuteNext()
at MySql.Data.MySqlClient.PreparableStatement.ExecuteNext()
at MySql.Data.MySqlClient.PreparableStatement.Execute()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(System.Data.CommandBehavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
at MySql.Data.MySqlClient.MySqlTransaction.Rollback()
at MySql.Data.MySqlClient.MySqlTransactionScope.Rollback(System.Transactions.SinglePhaseEnlistment)
at MySql.Data.MySqlClient.MySqlPromotableTransaction.System.Transactions.IPromotableSinglePhaseNotification.Rollback(System.Transactions.SinglePhaseEnlistment)
at System.Transactions.DurableEnlistmentAborting.EnterState(System.Transactions.InternalEnlistment)
at System.Transactions.DurableEnlistmentActive.InternalAborted(System.Transactions.InternalEnlistment)
at System.Transactions.TransactionStateAborted.EnterState(System.Transactions.InternalTransaction)
at System.Transactions.TransactionStateActive.Rollback(System.Transactions.InternalTransaction, System.Exception)
at System.Transactions.EnlistableStates.Timeout(System.Transactions.InternalTransaction)
at System.Transactions.Bucket.TimeoutTransactions()
at System.Transactions.BucketSet.TimeoutTransactions()
at System.Transactions.TransactionTable.ThreadTimer(System.Object)
at System.Threading.TimerQueueTimer.CallCallbackInContext(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
at System.Threading.TimerQueue.AppDomainTimerCallback()

所以看起来它正在尝试在命令超时时进行回滚。在此回滚期间似乎失败了。

So it looks like it's trying to do a rollback when the command timeouts. During this rollback something seems to fail.

NonQuery的try-catch并不捕获此异常。我的代码:

The try-catch around the NonQuery is not catching this exception. My code:

                try
                {
                    using (MyDB db = new MyDB())
                    {
                        db.Database.CommandTimeout = 240;
                        using (var tran = new TransactionScope())
                        {
                            db.MyTable.AddRange(dataToSave);
                            db.SaveChanges();
                            tran.Complete();
                        }
                    }
                }
                catch (Exception ex)
                {
                    monitor.OnException(ex);
                }

那么如何捕获回滚异常?我不希望我的应用程序在这种情况下完全崩溃。

So how can I catch the rollback exception? I don't want my application to crash completely when this happens.

推荐答案

不回答直接的问题 - 但它看起来不您正确使用TransactionScope。它看起来TransactionScope的目的是一级以上的常规数据库事务。例如。请参阅 .net中的示例docs

您最好使用普通的常规数据库事务来避免类似的问题。

Not answering direct problem - but it doesn't look that you use TransactionScope correctly. It looks that purpose of TransactionScope is one level above regular database transactions. E.g. see example in .net docs
You probably better to use plain regular database transactions to avoid similar issues.

这篇关于C#:如何在MySql回滚中捕获异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆