gpt4 book ai didi

c# - EF 有时可以在成功写入后重试吗?

转载 作者:行者123 更新时间:2023-11-30 20:32:38 27 4
gpt4 key购买 nike

我在数据库表上有 UNIQUE 约束,在写入新记录时偶尔会抛出异常。该约束涵盖三个字段 - 其中之一是 DATETIMEOFFSET(7)。当点击 webapi 端点时,该字段的值被设置为当前时间。

我想不出任何原因会导致多个 webapi 请求插入精确重复时间 - 考虑到时间字段的准确性,这似乎极不可能。

不幸的是,我无法重现异常,我们只是偶尔在日志中看到它。

我唯一能想到的是,如果在同一个请求中,Entity Framework 在认为失败后以某种方式重试数据库写入,但实际上并没有 - 导致异常。我们正在使用 SqlAzureExecutionStrategy,它在反编译其 ShouldRetryOn 方法后,看起来它会重试以下错误代码 ...

40613: Database not currently available 41301: A transaction dependency failure occurred, and the current transaction can no longer commit. 41302: The current transaction attempted to update a record that has been updated since this transaction started. The transaction was aborted. 41305: The current transaction failed to commit due to a repeatable read validation failure. 41325: The current transaction failed to commit due to a serializable validation failure. 10928: Resource ID : %d. The %ls limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. 10929: Resource ID : %d. The %ls minimum guarantee is %d, maximum limit is %d and the current usage for the database is %d. However, the server is currently too busy to support %ls greater than %d for this database. See 'http://go.microsoft.com/fwlink/?LinkId=26 40197: The service has encountered an error processing your request. Please try again. Error code %d. 40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d 233: The column '%.*ls' in table '%.*ls' cannot be null. 10053: Could not convert the data value due to reasons other than sign mismatch or overflow. 10054: The data value for one or more columns overflowed the type used by the provider. 10060: Connection error 20: ? 64: A connection was successfully established with the server, but then an error occurred during the pre-login handshake

我原以为它只会在写入失败时重试。是否有可能它确实写入了记录,但 Entity Framework 可能会感到困惑并重试?

更新

下面是异常(exception)...

System.Data.Entity.Infrastructure.RetryLimitExceededException: Maximum number of retries (5) exceeded while executing database operations with 'MyExecutionStrategy'.
See inner exception for the most recent failure. ---> System.Data.Entity.Core.UpdateException: An error occurred while updating the entries.
See the inner exception for details. ---> System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UQ_SessionLog'. Cannot insert duplicate key in object 'dbo.SessionLog'. The duplicate key value is (f6aeb1b8-c747-4f0b-9053-bf95a5630662, 2016-07-12 11:42:32.7077612 01:00, 0).
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean%26 dataReady)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task%26 task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task%26 task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at StackExchange.Profiling.Data.ProfiledDbCommand.ExecuteNonQuery() in d:\Files\GitHub\miniprofiler\dotnet\StackExchange.Profiling\Data\ProfiledDbCommand.cs:line 264
at System.Data.Common.DbCommand.ExecuteNonQueryAsync(CancellationToken cancellationToken)

最佳答案

DateTime 的精度并不像您认为的毫秒数那么多。在多线程环境下很可能会得到重复

试图找到一个关于它到底有多精确的权威答案: https://msdn.microsoft.com/EN-US/library/system.datetime.utcnow.aspx

“此属性的分辨率取决于系统计时器。”

你不是第一个遇到这个问题的人

C# DateTime.Now precision

DateTime precision vs accuracy?

https://manski.net/2014/07/high-resolution-clock-in-csharp/

等等等等

关于c# - EF 有时可以在成功写入后重试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41118205/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com