首页 > 解决方案 > SQL Server 等效于 Oracle 错误号

问题描述

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

我将 Oracle 引用替换为 SqlClient 引用(OracleConnectionto SqlConnectionOracleTransactiontoSqlTransaction等),一切正常。但是,在出现错误时尝试重新连接到数据库的逻辑有问题。

如果在尝试读取/写入数据库时​​出现问题,则会TryReconnect调用方法。该方法检查Oracle异常号是3114还是12571;如果是这样,它会尝试重新打开连接。

我检查了这些错误代码:

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

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

标签: sql-serveroraclesqlclient

解决方案


行为不同。您不能将 SQL Server 重试逻辑基于 Oracle 语义。对于初学者,即使在旧的 System.Data.SqlClient 库中, SqlConnection 也会重试连接。它的替代品Microsoft.Data.SqlClient包括可配置的重试逻辑,用于处理从本地应用程序到云数据库的连接,例如连接到 Azure SQL 的本地应用程序。此重试逻辑在当前 RTM 版本 3.0.0 中默认开启。

您还可以查看高级弹性库,例如Polly,这是一个非常流行的弹性包,它实现了恢复策略,如使用退避重试、断路器等。本文描述了Cadru.Polly,其中包含处理多个 SQL Server 瞬态故障的策略。您可以直接使用它,也可以处理该文章中描述的瞬态错误编号:

异常处理策略 错误处理
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
网络连接异常处理策略 11001

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

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

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


推荐阅读