是否有抛出但仍然提交数据的SqlExceptions?

时间:2010-04-29 05:59:36

标签: .net error-handling sqlexception

我最近遇到了错误:

  

System.Data.SqlClient.SqlException:   数据库的事务日志   'mydatabase'已满。找出原因   日志中的空间无法重用,请参阅   中的log_reuse_wait_desc列   sys.databases中

在我的一个Windows服务上。它应该在捕获一个Sql异常后重试,我没想到的是,似乎数据仍然存在(我正在使用SqlBulkCopy btw),无论它是否抛出异常。我以前从未遇到过这种情况。

我想知道是否还有其他情况会发生这样的事情,如果这件事完全可能在一开始呢?

修改

  

System.Data.UpdateException:更新条目时发生错误。有关详细信息,请参阅InnerException。 ---> System.Data.SqlClient.SqlException:数据库'MY_DB'的事务日志已满。要找出无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc列。      在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection)      在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection)      在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)      在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)      在System.Data.SqlClient.SqlDataReader.ConsumeMetaData()      在System.Data.SqlClient.SqlDataReader.get_MetaData()      在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)      在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)      在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result)      在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)      在System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method)      在System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior行为)      在System.Data.Common.DbCommand.ExecuteReader(CommandBehavior行为)      在System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator转换器,EntityConnection连接,字典2 identifierValues, List 1 generatedValues)      在System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)      ---内部异常堆栈跟踪结束---      在System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)      在System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)      at System.Data.Objects.ObjectContext.SaveChanges(Boolean acceptChangesDuringSave)      在System.Data.Objects.ObjectContext.SaveChanges()

PS。如果有人知道上述异常的错误代码,那也会有很大帮助。

2 个答案:

答案 0 :(得分:1)

  

如果这件事完全可能在第一时间完成?

是的,这是可能的。这取决于您的事务管理代码在异常情况下的作用。例如:

Connection connection = ConnectionFactory.create();

try {
    DoWorkOn(connection);
}
catch (Exception e) {
    Log.Message("SQL Problem", e);
}
finally {
    connection.commit();
}

...总会尝试提交。此行为内置于一些众所周知的事务管理库(J2EE为应用程序异常指定了此行为)。

我对.NET不太熟悉 - 如果你发布一个完整的堆栈跟踪,有人可能会根据使用的事务管理软件给你一个更好的答案。

答案 1 :(得分:1)

SQL命令可能会导致超时错误,但仍然会发生。您应该计划UPDATE和DELETE,以便可以多次调用它们,但只执行一次更改。例如

UPDATE MyTable SET DataField=1,LastChanged=GETUTCDATE()  
   WHERE PrimaryKeyField=x AND DataField=0

这样,如果DataField不再具有您期望的值,则UPDATE将不执行任何操作并保持LastChanged字段不变。