我有以下代码执行单个行到数据库表的提交(sql 2008 / .NET 4)
- using (var db = new MyDbDataContext(_dbConnectionString))
- {
- Action action = new Action();
- db.Actions.InsertOnSubmit(dbAction);
- db.SubmitChanges();
- }
通常一切都很好,但有一段时间我会得到以下例外:
在SO上有一些类似的问题,但是在阅读之后,我无法解决问题.
这可能是由于sql超时(在调用完成后接近25秒发生异常)?或者我应该期望在这种情况下的sql超时异常?
有人知道还有什么可能造成这种情况吗?
解决方法
DataContext.SubmitChanges
方法在其主体中具有以下代码行:
- // ...
- try
- {
- if (this.provider.Connection.State == ConnectionState.Open)
- {
- this.provider.ClearConnection();
- }
- if (this.provider.Connection.State == ConnectionState.Closed)
- {
- this.provider.Connection.Open();
- flag = true;
- }
- dbTransaction = this.provider.Connection.BeginTransaction(IsolationLevel.ReadCommitted);
- this.provider.Transaction = dbTransaction;
- new ChangeProcessor(this.services,this).SubmitChanges(failureMode);
- this.AcceptChanges();
- this.provider.ClearConnection();
- dbTransaction.Commit();
- }
- catch
- {
- if (dbTransaction != null)
- {
- dbTransaction.Rollback();
- }
- throw;
- }
- // ...
当连接超时时,执行catch块,并且dbTransaction.Rollback();
行将抛出一个InvalidOperationException.
如果您可以控制代码,可以像下面那样捕获异常:
- catch
- {
- // Attempt to roll back the transaction.
- try
- {
- if (dbTransaction != null)
- {
- dbTransaction.Rollback();
- }
- }
- catch (Exception ex2)
- {
- // This catch block will handle any errors that may have occurred
- // on the server that would cause the rollback to fail,such as
- // a closed connection.
- Console.WriteLine("Rollback Exception Type: {0}",ex2.GetType());
- Console.WriteLine(" Message: {0}",ex2.Message);
- }
- throw;
- }