1

我最近遇到了错误:

System.Data.SqlClient.SqlException:数据库“mydatabase”的事务日志已满。要找出日志中的空间不能被重用的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列

在我的一个 Windows 服务上。它应该在捕获 Sql 异常后重试,但我没想到的是数据似乎仍在通过(我正在使用 SqlBulkCopy 顺便说一句),无论它是否引发异常。我以前从未遇到过这种情况。

我想知道是否还有其他情况可能会发生这样的事情,以及这件事是否完全有可能首先发生?

编辑:

System.Data.UpdateException:更新条目时出错。有关详细信息,请参阅 InnerException。---> System.Data.SqlClient.SqlException:数据库“MY_DB”的事务日志已满。要找出日志中的空间不能被重用的原因,请参阅 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception 的 sys.databases 中的 log_reuse_wait_desc 列, Boolean 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。2 identifierValues, List1 generateValues) 在 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter 适配器) --- 内部异常堆栈跟踪结束 --- 在 System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, IEntityAdapter 适配器) 在 System.Data.Objects.ObjectContext.SaveChanges(Boolean acceptChangesDuringSave) 在 System.Data.Objects.ObjectContext.SaveChanges() 的 System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)

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

4

2 回答 2

1

如果这件事一开始就完全可能吗?

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

Connection connection = ConnectionFactory.create();

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

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

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

于 2010-04-29T21:17:55.763 回答
1

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

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

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

于 2011-07-20T10:59:02.447 回答