我最近遇到了错误:
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。如果有人知道上述异常的错误代码,那也会有很大帮助。
答案 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字段不变。