SQL 服务器相当于 Oracle 错误号

SQL Server equivalent to Oracle error numbers

我正在将 .NET 应用程序从 Oracle 迁移到 SQL 服务器数据库。该应用程序是在 2000 年代由第三方开发的,因此我们打算尽可能少地修改它,以避免引入新的错误。

我替换了 Oracle 对 SqlClient 的引用(OracleConnectionSqlConnectionOracleTransactionSqlTransaction 等)并且一切正常。但是,我在遇到错误时尝试重新连接到数据库的逻辑时遇到了问题。

如果尝试 read/write 到数据库时出现问题,将调用方法 TryReconnect。该方法检查Oracle异常号是3114还是12571;如果是这样,它会尝试重新打开连接。

我检查了这些错误代码:

我搜索了 SQL 服务器的等效错误代码,但找不到。我检查了 MSSQL and .NET SqlClient 文档,但不确定其中任何一个等同于 ORA-3114 和 ORA-12571。

谁能帮我决定在这个逻辑中应该检查哪些错误号?我考虑过检查代码 0(当我停止数据库以强制出错并测试它时,我看到它发生了)和 -2(超时已过期),但我不太确定。

行为不同。您不能将 SQL 服务器重试逻辑基于 Oracle 语义。对于初学者,SqlConnection will retry to connect even in the old System.Data.SqlClient library. Its replacement, Microsoft.Data.SqlClient includes configurable retry logic 处理从本地应用程序到云数据库的连接,例如连接到 Azure 的本地应用程序 SQL。此重试逻辑在当前 RTM 版本 3.0.0.

中默认启用

您还可以查看 Polly, a very popular resiliency package that implements recovery strategies like retries with backoff, circuit breakers etc. This article describes Cadru.Polly 等高级弹性库,其中包含处理多个 SQL 服务器瞬态故障的策略。您可以直接使用它,也可以处理那篇文章中描述的暂时性错误编号:

Exception Handling Strategy Errors Handled
SqlServerTransientExceptionHandlingStrategy 40501, 49920, 49919, 49918, 41839, 41325, 41305, 41302, 41301, 40613, 40197, 10936, 10929, 10928, 10060, 10054, 10053, 4221, 4060, 12015, 233, 121, 64, 20
SqlServerTransientTransactionExceptionHandlingStrategy 40549, 40550
SqlServerTimeoutExceptionHandlingStrategy -2
NetworkConnectivityExceptionHandlingStrategy 11001

Polly 允许您组合策略并为它们指定不同的重试策略,例如:

  • 在某些情况下使用缓存响应(查找数据?)
  • 在其他情况下(死锁?)使用回退(甚至随机延迟)重试。如果您 运行 超时,随机延迟可能 非常 有用,因为过多的并发操作会导致死锁或超时。没有它,所有失败的请求都会同时重试,导致又一次失败
  • 使用断路器切换到不同的服务或服务器。

您可以创建一个 Oracle 策略,这样您就可以在整个项目中使用 Polly 并处理所有可恢复的故障,而不仅仅是数据库重试。