適用於: .NET Framework
.NET
.NET 標準
Microsoft.Data.SqlClient.SqlConfigurableRetryFactory 建立常見重試排程的提供者。 可設定重試邏輯預設是關閉的。 將提供者指派給 SqlConnection.RetryLogicProvider 或 SqlCommand.RetryLogicProvider,即可為該物件啟用。
選擇重試提供者
| 工廠方法 | 延遲模式 |
|---|---|
| SqlConfigurableRetryFactory.CreateFixedRetryProvider | 每次重試前大約有相同的延遲。 |
| SqlConfigurableRetryFactory.CreateIncrementalRetryProvider | 每次重試後都會增加 DeltaTime 延遲。 |
| SqlConfigurableRetryFactory.CreateExponentialRetryProvider | 每次重試後延遲會呈指數成長。 |
| SqlConfigurableRetryFactory.CreateNoneRetryProvider | 不會重試。 這個供應商是預設的。 |
固定、增量和指數提供者會在每個間隔中加入隨機抖動。 抖動可在許多用戶端遭遇相同服務中斷時,減少同步重試潮。
NumberOfTries 是包含初始運算的總嘗試次數。 例如,允許 NumberOfTries = 3 初次嘗試,最多可重試兩次。 其有效範圍為1至60。
內建瞬態錯誤清單
當 SqlRetryLogicOption.TransientErrors 為 null 時,內建提供者會依失敗來源分組,重試 SqlConfigurableRetryFactory.BaselineTransientErrors 中的 20 個錯誤編號:
| 失效區域 | 錯誤編號 |
|---|---|
| 登入程序傳輸 |
233、997、10060 |
| 登入時的資料庫可用性 |
4060、4221 |
| 陳述層級 |
1204、1205、1222 |
| 資源限制或節流 |
10928、10929、40501、49918、49919、49920 |
| Azure SQL 服務容錯移轉 |
40143、40197、40540、40613 |
| 專用 SQL 池狀態 |
42108、42109 |
每個錯誤會在接下來的章節中說明。
Important
設定 TransientErrors 取代了內建的清單。 它不會加入到清單中。 納入提供者應重試的所有錯誤。
在 Microsoft。Data.SqlClient 7.0 將SqlConfigurableRetryFactory.BaselineTransientErrors內建清單以唯讀集合形式揭露。 利用它來擴展基準線,而不會從驅動程式來源複製錯誤號碼:
var transientErrors = SqlConfigurableRetryFactory.BaselineTransientErrors
.Append(12345)
.ToArray();
var options = new SqlRetryLogicOption
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(2),
MaxTimeInterval = TimeSpan.FromSeconds(30),
TransientErrors = transientErrors,
};
對於較舊版的驅動程式,請建立一個由應用程式擁有的集合,其中包含您所需的基準錯誤以及其他錯誤。 在複製基準資料前,先選擇與你已安裝套件版本相符的 SqlClient 來源標籤 並檢查 SqlConfigurableRetryFactory.cs。
main 分支上的清單可能會在你的套件發布後變更。
連線建立時的錯誤
以下錯誤可在內建清單中重試,或值得在內建清單上方新增 TransientErrors 。
以下錯誤若發生於建立連線期間或向伺服器傳送要求時,可能只是暫時性的。 以短暫且有上限的退避間隔進行重試。 重複幾次後仍持續的錯誤通常表示設定問題,例如伺服器錯誤、權限遺失、加密設定不相容,或配額用盡,重試無法解決。
| 錯誤 | 失敗類型 | Message | Troubleshooting |
|---|---|---|---|
64 |
登入時的傳輸 | A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - The specified network name is no longer available.) |
TCP 連線在握手中途中斷。 不是憑證故障。 如果問題持續,請檢查是否有用戶端網路不穩定或中介裝置中斷半建立連線。 |
233 |
登入前傳輸(TLS) | The client was unable to establish a connection because of an error during connection initialization process before login. |
當伺服器因資源耗盡、連線限制或客戶端不支援而無法接受連線時,通常會回傳此錯誤。 不是憑證故障。 確認伺服器健康狀況,然後檢查客戶端登入逾時、TLS 設定,以及客戶端/伺服器 TLS 版本相容性。 |
4060 |
資料庫可用性或存取 | Cannot open database "%.*ls" requested by the login. The login failed. |
登入功能會驗證,但無法開啟指定的資料庫。 暫時性原因包括資料庫處於過渡狀態(故障轉移、還原、縮放)或自動暫停。 持續性原因(資料庫不存在、登入無法存取)不會透過重試解決;檢查資料庫名稱、登入映射和資料庫狀態。 |
4221 |
可讀-次級轉換 | Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. |
此副本無法供登入使用,因為在副本被回收時仍在進行中的交易缺少資料列版本。 回滾或提交主要節點上作用中的交易,以解決此問題。 透過避免在主節點上進行長時間的寫入交易來緩解。 |
10053 |
本地運輸中止 | A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine.) |
當地方面終止了連結。 檢查用戶端網路健康狀況以及任何本地防火牆或 VPN 用戶端。 |
10054 |
遠端傳輸重設 | A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) |
遠端會發送 TCP 重置。 常見原因包括:對等程序當機、防火牆注入重置,或 Azure SQL 閘道關閉閒置連線。 對於閒置後重置的情況,請在用戶端啟用 TCP keepalive,或縮短連線集區的閒置逾時時間。 |
10060 |
連線超時 | A connection attempt failed because the connected party did not properly respond after a period of time. |
伺服器或中介網路裝置在 TCP 連線逾時前沒有回應。 檢查伺服器健康狀況、路由、防火牆規則,以及配置好的主機和埠是否可被存取。 |
10928 |
資料庫資源限制 | Resource ID: %d. The %s limit for the database is %d and has been reached. |
資料庫超過 Azure SQL 資源治理限制。 資源 ID 1 表示工作者上限;資源 ID 2 表示工作階段上限。 從訊息中識別限制型態,然後減少並行性、擴充資料庫規模,或縮短長期執行的資源操作。 |
10929 |
資料庫節流 | Resource ID: %d. The %s 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 requests greater than %d for this database. |
資料庫已超出其最低保證門檻,且底層伺服器正在節流。 當鄰居負載下降時,重試通常會成功。 持續發生的情況表示你需要更高的服務層級或較少噪音的環境。 |
40020、40143、40166、40540 |
Azure SQL 容錯移轉子代碼 | 在容錯移轉期間,於錯誤 40197 的 Error code %d 欄位中回報。 |
子程式碼嵌入於 40197 故障轉移訊息中,該訊息中某些路徑會以頂層錯誤編號的形式出現。 把他們當成40197一樣對待。 |
40197 |
Azure SQL failover | The service has encountered an error processing your request. Please try again. Error code %d. |
軟體升級、硬體故障或其他 Azure SQL 故障轉移事件。 重新連接會引導你到健康的複製品。 嵌入的錯誤代碼用來識別故障轉移類型。 如果錯誤持續,請擷取會話追蹤 ID,並聯絡客服。 |
40501 |
Azure SQL 節流 | The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. |
Azure SQL 引擎節流 建議的底線是10秒後退。 持續節流表示工作負載已超出資料庫獲配的資源;請升級服務層級或降低並行數。 |
40613 |
資料庫無法使用 | Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'. |
資料庫無法使用,通常發生在故障轉移期間,或在調整規模作業期間短暫發生。 在後退時重試;如果問題持續超過幾分鐘,擷取會話追蹤 ID,並開啟支援案件。 |
42108 |
SQL 集區已暫停 | Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. |
專用的 SQL 池(Synapse)處於暫停狀態。 只有在池子恢復後,重試才會成功。 可以明確恢復集區,或將工作負載排程為在集區恢復後執行。 |
42109 |
SQL 集區正在恢復 | The SQL pool is warming up. Please try again. |
專用的 SQL 池正在恢復運作。 在後退區重試直到池子上線;暖身通常需要幾分鐘。 |
49918 |
服務資源短缺 | Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. |
伺服器目前無法分配足夠的資源來滿足這個請求。 在後退時重試。 如果錯誤持續,就擴大資料庫或彈性池。 |
49919 |
管理作業節流 | Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". |
管理操作的訂閱層級並行限制。 減少並行的建立/更新呼叫,或將其錯開執行。 |
49920 |
訂閱操作限速 | Cannot process request. Too many operations in progress for subscription "%ld". |
飛行中操作的訂閱級並行限制。 降低並行度,或等待進行中的作業完成。 |
語句層級錯誤不在此列表中,因為它們會在連線建立後觸發,且失敗後會讓會話仍可用。 最常見的可重試語句錯誤是 1205(死鎖受害者)和 1222(鎖-請求逾時)。 請重試整個交易作業,而不是只重試失敗的單一陳述式。
錯誤訊息內容來自 Azure SQL 暫時性連線錯誤。 這些錯誤可在 SQL Server、Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 資料庫,以及 Azure Synapse Analytics 的專用 SQL 池中重試。
指令執行時的錯誤
以下錯誤發生在連線建立後,指令執行時。 重試整筆交易,不要重試個別對帳單。 在交易中重試其中一個陳述式,可能會重複先前已完成的工作,或違反該交易的順序保證。
| 錯誤 | 失敗類型 | Message | Troubleshooting |
|---|---|---|---|
1204 |
鎖定資源已耗盡 | The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions. |
鎖管理器無法在伺服器上分配更多鎖資源。 回滾交易,短暫等待後再試一次。 持續發生表示存在爭用或記憶體壓力,必須透過擴充或查詢調校來解決。 |
1205 |
僵局受害者 | Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction. |
引擎選擇了此工作階段來打破死結,並回復其交易。 在客戶端回滾釋放剩餘狀態,然後重新嘗試整個交易。 |
1222 |
鎖定要求逾時 | Lock request time out period exceeded. |
引擎放棄等待鎖。 在短暫退避後,重試該事務。 反覆出現的情況表示存在必須透過索引、查詢調校或 SET LOCK_TIMEOUT 檢閱來解決的封鎖問題。 |
3960 |
快照隔離更新衝突 | Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table '%.*ls' directly or indirectly in database '%.*ls' to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement. |
兩個在快照隔離下執行的交易嘗試更新同一列。 引擎終止了這次交易。 重試整個事務,或變更發生衝突之寫入作業的隔離層級。 如果您的應用程式使用快照隔離,請將其新增至自訂的暫時性錯誤清單。 |
反映批次或結構問題的語句層級錯誤(例如 102 語法錯誤、 207 無效欄位、 2812 遺失儲存程序)並非暫時性。 修正查詢文字或結構綁定;重試沒用。
錯誤訊息文字來自 sys.messages 目錄檢視。 這些錯誤來自 SQL Server 引擎,因此無論是在 SQL Server、Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 資料庫,還是 Azure Synapse Analytics 中的專用 SQL 集區,其編號都相同,且不論使用哪一種驅動程式皆然。
驅動程式而非引擎顯示客戶端的陳述式逾時與取消錯誤(例如,Microsoft。Data.SqlClient -2 逾時),所以這些錯誤不在內建清單中。 如果您的應用程式分開攔截這些錯誤,請在與先前所述引擎錯誤相同的交易邊界內處理它們。
指令與交易行為
內建的服務程式會在指令在 TransactionScope 環境中執行或有 SqlTransaction 附加條件時跳過重試。 指令執行一次且不重試邏輯。 在交易中重試單一語句可能會重複先前的工作,或違反交易的預期順序。
注意事項
對於交易中的死鎖及其他可重試的失敗,請先回滾,再將整個交易視為一個單位重新執行。 不要只重試失敗的指令。
使用 SqlRetryLogicOption.AuthorizedSqlCondition 將命令重試限制於您的應用程式可安全重複執行的作業。 述詞接受指令文字。 若謂詞回傳 false,該指令執行一次且不重試邏輯。
範例
完整的連線與指令範例,請參見: