-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
SqlServerTransientExceptionDetector.cs
708 lines (702 loc) · 49.8 KB
/
SqlServerTransientExceptionDetector.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.ComponentModel;
using Microsoft.Data.SqlClient;
namespace Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal;
/// <summary>
/// Detects the exceptions caused by SQL Server transient failures.
/// </summary>
public static class SqlServerTransientExceptionDetector
{
/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
public static bool ShouldRetryOn(Exception? ex)
{
if (ex is SqlException sqlException)
{
foreach (SqlError err in sqlException.Errors)
{
switch (err.Number)
{
// SQL Error Code: 49983
// The '%ls' operation failed to complete. Retry the operation. Create a support request if the retry attempts do not succeed.
case 49983:
// SQL Error Code: 49977
// The elastic pool '%ls' is busy with another operation. Please wait until the ongoing operation finishes and try again.
case 49977:
// SQL Error Code: 49920
// Cannot process request. Too many operations in progress for subscription "%ld".
// The service is busy processing multiple requests for this subscription.
// Requests are currently blocked for resource optimization. Query sys.dm_operation_status for operation status.
// Wait until pending requests are complete or delete one of your pending requests and retry your request later.
case 49920:
// SQL Error Code: 49919
// Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".
// The service is busy processing multiple create or update requests for your subscription or server.
// Requests are currently blocked for resource optimization. Query sys.dm_operation_status for pending operations.
// Wait till pending create or update requests are complete or delete one of your pending requests and
// retry your request later.
case 49919:
// SQL Error Code: 49918
// Cannot process request. Not enough resources to process request.
// The service is currently busy. Please retry the request later.
case 49918:
// SQL Error Code: 49802
// Database is unavailable at the moment, please retry connection at later time.
case 49802:
// SQL Error Code: 49510
// Managed instance is busy with another operation. Please try your operation later.
case 49510:
// SQL Error Code: 47139
// Join contained availability group '%.*ls' failed to create group master '%.*ls' Database ID. Please retry the operation again.
case 47139:
// SQL Error Code: 47137
// Cannot create contained system databases in contained availability group '%.*ls' It might be caused by
// temporary condition. Retry the operation.
case 47137:
// SQL Error Code: 47132
// Joining availability group '%.*ls' with rebuilding contained system DB has failed because rebuilding contained MSDB
// has failed. This is caused by contained MSDB is still used. Retry the operation later.
case 47132:
// SQL Error Code: 45547
// The create operation has timed out in one of the backend workflows. Please retry the operation.
case 45547:
// SQL Error Code: 45319
// The service objective assignment for database '%.*ls' on server '%.*ls' could not be completed as the database
// is too busy. Reduce the workload before initiating another service objective update.
case 45319:
// SQL Error Code: 45182
// Database '%ls' is busy with another operation. Please try your operation later.
case 45182:
// SQL Error Code: 45179
// The operation timed out and automatically rolled back. Please retry the operation.
case 45179:
// SQL Error Code: 45161
// Managed instance '%.*ls' is busy with another operation. Please try your operation later.
case 45161:
// SQL Error Code: 45157
// Server '%.*ls' is busy with another operation. Please try your operation later.
case 45157:
// SQL Error Code: 45156
// Subscription '%.*ls' is busy with another operation. Please try your operation later.
case 45156:
// SQL Error Code: 45153
// Management Service is not currently available. Please retry the operation later. If the problem persists,
// contact customer support, and provide them the session tracing ID of '%ls'.
case 45153:
// SQL Error Code: 42109
// The SQL pool is warming up. Please try again.
case 42109:
// SQL Error Code: 42108
// Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again.
case 42108:
// SQL Error Code: 42029
// An internal error happened while generating a new DBTS for database %.*ls. Please retry the operation.
case 42029:
// SQL Error Code: 41840
// Could not perform the operation because the elastic pool or managed instance has reached its quota for in-memory tables.
// This error may be transient. Please retry the operation. See 'http://go.microsoft.com/fwlink/?LinkID=623028' for more information.
case 41840:
// SQL Error Code: 41839
// Transaction exceeded the maximum number of commit dependencies.
case 41839:
// SQL Error Code: 41823
// Could not perform the operation because the database has reached its quota for in-memory tables. This error may be transient.
// Please retry the operation. See 'http://go.microsoft.com/fwlink/?LinkID=623028' for more information.
case 41823:
// SQL Error Code: 41701
// The Activation Context is unavailable at this time. The Windows Fabric Runtime is unavailable at this time,
// retry later. Wait for the activation context to become available, then retry.
case 41701:
// SQL Error Code: 41700
// System views related to Windows Fabric partitions and replicas are not available at this time,
// because replica manager has not yet started. Wait for replica manager to start, then retry the system view query.
case 41700:
// SQL Error Code: 41640
// Database '%ls' encountered a transient error (error code: 0x%08X) while performing task '%ls'.
// Refer to the SQL Server error log for information about the errors that were encountered.
// If this condition persists, contact the system administrator.
case 41640:
// SQL Error Code: 41619
// Windows Fabric '%ls' (partition ID '%ls')encountered transient error %d while waiting for build replica operation
// on database '%ls' (ID %d). Refer to the SQL Server error log for information about the errors that were encountered.
// If this condition persists, contact the system administrator.
case 41619:
// SQL Error Code: 41614
// Fabric Service '%ls' encountered a transient error while performing Windows Fabric operation on '%ls' database
// (ID %d). Refer to the SQL Server error log for information about the errors that were encountered.
// If this condition persists, contact the system administrator.
case 41614:
// SQL Error Code: 41383
// An internal error occurred while running the DMV query. This was likely caused by concurrent DDL operations. Please retry the query.
case 41383:
// SQL Error Code: 41339
// The table '%.*ls' has been created or altered after the start of the current transaction. The transaction was aborted.
// Please retry the transaction.
case 41339:
// SQL Error Code: 41325
// The current transaction failed to commit due to a serializable validation failure.
case 41325:
// SQL Error Code: 41305
// The current transaction failed to commit due to a repeatable read validation failure.
case 41305:
// SQL Error Code: 41302
// The current transaction attempted to update a record that has been updated since the transaction started.
case 41302:
// SQL Error Code: 41301
// Dependency failure: a dependency was taken on another transaction that later failed to commit.
case 41301:
// SQL Error Code: 40938
// The Server DNS Alias '%.*ls' is busy with another operation and cannot perform the '%.*ls' operation. Please try again later.
case 40938:
// SQL Error Code: 40918
// The Failover Group '%.*ls' is busy with another operation and cannot perform the '%.*ls' operation. Please try again later
case 40918:
// SQL Error Code: 40903
// The server '%.*ls' is currently busy. Please wait a few minutes before trying again.
case 40903:
// SQL Error Code: 40890
// The elastic pool is busy with another operation.
case 40890:
// SQL Error Code: 40675
// The service is currently too busy. Please try again later.
case 40675:
// SQL Error Code: 40671
// Unable to '%.*ls' '%.*ls' on server '%.*ls'. Please retry the connection later.
case 40671:
// SQL Error Code: 40648
// Too many requests have been performed. Please retry later.
case 40648:
// SQL Error Code: 40642
// The server is currently too busy. Please try again later.
case 40642:
// SQL Error Code: 40623
// Reauthentication failed for login %.*ls. Within the past reauthentification interval, the login has become invalid
// due to a password change, a dropped login, or other cause. Please retry login.
case 40623:
// SQL Error Code: 40613
// Database XXXX on server YYYY is not currently available. Please retry the connection later.
// If the problem persists, contact customer support, and provide them the session tracing ID of ZZZZZ.
case 40613:
// SQL Error Code: 40540
// The service has encountered an error processing your request. Please try again.
case 40540:
// SQL Error Code: 40501
// The service is currently busy. Retry the request after 10 seconds. Code: (reason code to be decoded).
case 40501:
// SQL Error Code: 40197
// The service has encountered an error processing your request. Please try again.
case 40197:
// SQL Error Code: 40189
// The resource quota for the current database has been exceeded and this request has been aborted.
// Please rerun your request in the next quota window. %s
case 40189:
// SQL Error Code: 40143
// The service has encountered an error processing your request. Please try again.
case 40143:
// SQL Error Code: 40106
// The schema scope set in the session is not the current schema scope for the current partition. Please rerun your query.
case 40106:
// SQL Error Code: 39152
// Transient error communicating with the streaming runtime due to unfinished stop streaming job operation. Please retry the operation.
case 39152:
// SQL Error Code: 39151
// Transient error communicating with the streaming runtime. Please retry the operation.
case 39151:
// SQL Error Code: 39110
// Maximum number of concurrent external script queries for this user has been reached. Limit is %d.
// Please retry the operation. External script request id is %ls.
case 39110:
// SQL Error Code: 39108
// Maximum number of concurrent external script users has been reached. Limit is %d. Please retry the operation. External script request id is %ls.
case 39108:
// SQL Error Code: 39025
// External script execution failed as extensibility environment is not ready yet. Retry the operation when the server is fully started.
case 39025:
// SQL Error Code: 37327
// Maximum number of concurrent DBCC commands running in the enclave has been reached. The maximum number of
// concurrent DBCC queries is %d. Try rerunning the query.
case 37327:
// SQL Error Code: 37202
// An instance pool with name '%.*ls' is busy with another ongoing operation.
case 37202:
// SQL Error Code: 35293
// Error in retrieving extended recovery forks from the primary replica. The extended-recovery-fork stack changed
// while being retrieved by the secondary replica. Retry the operation.
case 35293:
// SQL Error Code: 35256
// The session timeout value was exceeded while waiting for a response from the other availability replica in the
// session. That replica or the network might be down, or the command might be misconfigured. If the partner is running
// and visible over the network, retry the command using correctly configured partner-connection parameters.
case 35256:
// SQL Error Code: 35218
// An error occurred while trying to set the initial Backup LSN of database '%.*ls'. Primary database is temporarily
// offline due to restart or other transient condition. Retry the operation.
case 35218:
// SQL Error Code: 35216
// An error occurred while adding or removing a log truncation holdup to build secondary replica from primary availability
// database '%.*ls'. Primary database is temporarily offline due to restart or other transient condition. Retry the operation.
case 35216:
// SQL Error Code: 33123
// Cannot drop or alter the database encryption key since it is currently in use on a mirror or secondary availability replica.
// Retry the command after all the previous reencryption scans have propagated to the mirror or secondary availability replicas
// or after availability relationship has been disabled.
case 33123:
// SQL Error Code: 30085
// A stoplist cache cannot be generated while processing a full-text query or performing full-text indexing. There is
// not enough memory to load the stoplist cache. Rerun the query or indexing command when more resources are available.
case 30085:
// SQL Error Code: 30080
// The full-text population on table '%ls' cannot be started because the full-text catalog is importing data from
// existing catalogs. After the import operation finishes, rerun the command.
case 30080:
// SQL Error Code: 25740
// Unable to start event session '%.*ls' because system is busy. Please try again later.
case 25740:
// SQL Error Code: 25738
// Event session '%.*ls' could not be started because system is currently busy. Please try again later.
case 25738:
// SQL Error Code: 25003
// Upgrade of the distribution database MSmerge_subscriptions table failed. Rerun the upgrade procedure in order
// to upgrade the distribution database.
case 25003:
// SQL Error Code: 22984
// An error occurred while waiting on the log reader history cache event. This error is reported by the internal task
// scheduling and might be transient. Retry the operation.
case 22984:
// SQL Error Code: 22760
// Aborting Synapse Link Publish task for partition %ld timed out. Retry this operation later.
case 22760:
// SQL Error Code: 22759
// Aborting Synapse Link Snapshot task for table %ld timed out. Retry this operation later.
case 22759:
// SQL Error Code: 22758
// Aborting Synapse Link Commit task for table group '%s' timed out. Retry this operation later.
case 22758:
// SQL Error Code: 22754
// Aborting Synapse Link Capture task for this database timed out. Retry this operation later.
case 22754:
// SQL Error Code: 22498
// There is not enough resources to perform the operation. Please retry your operation later.
case 22498:
// SQL Error Code: 22493
// The database '%.*ls' failed to sync. Please retry the operation again. If the problem persists contact
// Microsoft Azure Customer Support.
case 22493:
// SQL Error Code: 22491
// The DDL statement failed due to an internal error. Please retry the operation again. If the problem persists contact
// Microsoft Azure Customer Support.
case 22491:
// SQL Error Code: 22430
// Operation failed as the Database '%.*ls' is shutting down. Please retry the operation again. If the problem persists
// contact Microsoft Azure Customer Support.
case 22430:
// SQL Error Code: 22427
// Operation failed due to an error in a background task. Please retry the operation again. If the problem persists
// contact Microsoft Azure Customer Support.
case 22427:
// SQL Error Code: 22358
// The Database Controller required for this operation was not found. Please retry the operation again. If the problem
// persists contact Microsoft Azure Customer Support.
case 22358:
// SQL Error Code: 22355
// Lock manager does not exist. Please retry the operation again. If the problem persists contact
// Microsoft Azure Customer Support.
case 22355:
// SQL Error Code: 22353
// The SQL instances has not been correctly setup to allow this operation. Please retry the operation again.
// If the problem persists contact Microsoft Azure Customer Support.
case 22353:
// SQL Error Code: 22335
// Cannot obtain a LOCK resource at this time due to internal error. Rerun your statement when there are fewer active users.
case 22335:
// SQL Error Code: 22226
// An internal error (%d, %d) occured. Please retry the operation again. If the problem persists contact
// Microsoft Azure Customer Support.
case 22226:
// SQL Error Code: 22225
// An internal error (%d, %d) occured. Please retry the operation again. If the problem persists contact
// Microsoft Azure Customer Support.
case 22225:
// SQL Error Code: 21503
// Cleanup of merge meta data cannot be performed while merge processes are running. Retry this operation after
// the merge processes have completed.
case 21503:
// SQL Error Code: 20041
// Transaction rolled back. Could not execute trigger. Retry your transaction.
case 20041:
// SQL Error Code: 19494
// Automatic seeding of availability database '%ls' in availability group '%.*ls' failed with a transient error.
// The operation will be retried.
case 19494:
// SQL Error Code: 19416
// One or more databases in availability group '%.*ls' are not synchronized. On a synchronous-commit availability
// replica, ALTER AVAILABILITY GROUP <group_name> OFFLINE is not allowed when one or more databases are not
// synchronized. Wait for all databases to reach the SYNCHRONIZED state, and retry the command.
case 19416:
// SQL Error Code: 19413
// An attempt to switch Always On Availability Groups to the local Windows Server Failover Clustering (WSFC) cluster
// context failed. This attempt failed because switching the cluster context back to the local cluster at this time
// might cause data loss because one or more secondary databases on synchronous-commit replicas are not in the
// SYNCHRONIZED state. Wait until all synchronous-commit secondary databases are synchronized, and then retry the
// ALTER SERVER CONFIGURATION SET HADR CLUSTER LOCAL command.
case 19413:
// SQL Error Code: 18858
// Could not read data from replication table '%s'. If retrying does not fix the issue, drop and reconfigure replication.
case 18858:
// SQL Error Code: 18401
// Login failed for user '%s'. Reason: Server is in script upgrade mode. Only administrator can connect at this time.
// Devnote: this can happen when SQL is going through recovery (e.g. after failover)
case 18401:
// SQL Error Code: 17889
// A new connection was rejected because the maximum number of connections on session ID %d has been reached.
// Close an existing connection on this session and retry.%.*ls
case 17889:
// SQL Error Code: 17197
// Login failed due to timeout; the connection has been closed. This error may indicate heavy server load.
// Reduce the load on the server and retry login.
case 17197:
// SQL Error Code: 17067
// SQL Server Assertion: File: <%s>, line = %d %s. This error may be timing-related. If the error persists after
// rerunning the statement, use DBCC CHECKDB to check the database for structural integrity, or restart the server
// to ensure in-memory data structures are not corrupted.
case 17067:
// SQL Error Code: 17066
// SQL Server Assertion: File: <%s>, line=%d Failed Assertion = '%s'. This error may be timing-related. If the error
// persists after rerunning the statement, use DBCC CHECKDB to check the database for structural integrity, or restart
// the server to ensure in-memory data structures are not corrupted.
case 17066:
// SQL Error Code: 17065
// SQL Server Assertion: File: <%s>, line = %d Failed Assertion = '%s' %s. This error may be timing-related.
// If the error persists after rerunning the statement, use DBCC CHECKDB to check the database for structural integrity,
// or restart the server to ensure in-memory data structures are not corrupted.
case 17065:
// SQL Error Code: 16555
// Operation failed due to an error while processing rejected rows. Intermediate results, if any, should be discarded
// as such results may not be complete. Please retry the operation. If the problem persists, contact
// Microsoft Azure Customer Support.
case 16555:
// SQL Error Code: 16554
// Operation failed due to an error in a background task. Please retry the operation again. If the problem persists
// contact Microsoft Azure Customer Support.
case 16554:
// SQL Error Code: 16528
// Operation '%ls %ls' failed. Retry the operation later.
case 16528:
// SQL Error Code: 14906
// The database '%s' is not accessible. Ensure that the remote database exists. If you believe that your database should
// be accessible please retry the command.
case 14906:
// SQL Error Code: 14868
// Inbound migration is in progress or paused. Migration direction outbound cannot be set at this time. Please retry
// after inbound migration is complete.
case 14868:
// SQL Error Code: 14817
// The server '%s' is not accessible. Ensure that the remote server exists and the Azure SQL DB Firewall Rules permit
// access to the server. If you believe that your server should be accessible please retry the command.
case 14817:
// SQL Error Code: 14355
// The MSSQLServerADHelper service is busy. Retry this operation later.
case 14355:
// SQL Error Code: 11539
// One of the types specified in WITH RESULT SETS clause has been modified after the EXECUTE statement started running.
// Please rerun the statement.
case 11539:
// SQL Error Code: 11001
// An error has occurred while establishing a connection to the server. When connecting to SQL Server,
// this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections.
// (provider: TCP Provider, error: 0 - No such host is known.) (.Net SqlClient Data Provider)
case 11001:
// SQL Error Code: 10936
// Resource ID : %d. The request limit for the elastic pool is %d and has been reached.
// See 'https://go.microsoft.com/fwlink/?LinkId=267637' for assistance.
case 10936:
// SQL Error Code: 10930
// The service is currently too busy. Please try again later.
case 10930:
// SQL Error Code: 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.
// For more information, see https://go.microsoft.com/fwlink/?LinkId=267637. Otherwise, please try again.
case 10929:
// SQL Error Code: 10928
// Resource ID: %d. The %s limit for the database is %d and has been reached. For more information,
// see https://go.microsoft.com/fwlink/?LinkId=267637.
case 10928:
// SQL Error Code: 10922
// %ls failed. Rerun the statement.
case 10922:
// SQL Error Code: 10060
// A network-related or instance-specific error occurred while establishing a connection to SQL Server.
// The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server
// is configured to allow remote connections. (provider: TCP Provider, error: 0 - A connection attempt failed
// because the connected party did not properly respond after a period of time, or established connection failed
// because connected host has failed to respond.)"}
case 10060:
// SQL Error Code: 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.)
case 10054:
// SQL Error Code: 10053
// A transport-level error has occurred when receiving results from the server.
// An established connection was aborted by the software in your host machine.
case 10053:
// SQL Error Code: 9985
// There is not enough memory to generate a search property list cache. Rerun your full-text indexing statement when more resources are available.
case 9985:
// SQL Error Code: 9515
// An XML schema has been altered or dropped, and the query plan is no longer valid. Please rerun the query batch.
case 9515:
// SQL Error Code: 9020
// The log for database '%ls' failed to grow while shrink in progress. Please retry.
case 9020:
// SQL Error Code: 8651
// Could not perform the operation because the requested memory grant was not available in resource pool '%ls' (%ld).
// Rerun the query, reduce the query load, or check resource governor configuration setting.
case 8651:
// SQL Error Code: 8645
// A timeout occurred while waiting for memory resources to execute the query in resource pool '%ls' (%ld). Rerun the query.
case 8645:
// SQL Error Code: 8628
// A time out occurred while waiting to optimize the query. Rerun the query.
case 8628:
// SQL Error Code: 7951
// Warning: Could not complete filestream consistency checks due to an operating system error. Any consistency errors
// found in the filestream subsystem will be silenced. Please refer to other errors for more information.
// This condition is likely transient; try rerunning the command.
case 7951:
// SQL Error Code: 6292
// The transaction that is associated with this operation has been committed or rolled back. Retry with a different transaction.
case 6292:
// SQL Error Code: 5529
// Failed to remove a FILESTREAM file. The database is a primary database in an availability group. Wait for the
// FILESTREAM data files to be hardened on every secondary availability replica. Then retry the drop file operation.
case 5529:
// SQL Error Code: 5280
// An unexpected protocol element was recevied during the execution of a consistency check command. Retry the operation.
case 5280:
// SQL Error Code: 4221
// Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.
// The replica is not available for login because row versions are missing for transactions that were in-flight
// when the replica was recycled. The issue can be resolved by rolling back or committing the active transactions
// on the primary replica. Occurrences of this condition can be minimized by avoiding long write transactions on the primary.
case 4221:
// SQL Error Code: 3980
// The request failed to run because the batch is aborted, this can be caused by abort signal sent from client,
// or another request is running in the same session, which makes the session busy.
case 3980:
// SQL Error Code: 4184
// Cannot retrieve table data for the query operation because the table ""%.*ls"" schema is being altered too frequently.
// Because the table ""%.*ls"" contains a filtered index or filtered statistics, changes to the table schema require
// a refresh of all table data. Retry the query operation, and if the problem persists, use SQL Server Profiler to identify
// what schema-altering operations are occurring.
case 4184:
// SQL Error Code: 4117
// Cannot retrieve table data for the query operation because the table ""%.*ls"" schema is being altered too frequently.
// Because the table ""%.*ls"" contains a computed column, changes to the table schema require a refresh of all table data.
// Retry the query operation, and if the problem persists, use SQL Server Profiler to identify what schema-altering operations are occurring.
case 4117:
// SQL Error Code: 4060
// Cannot open database "%.*ls" requested by the login. The login failed.
case 4060:
// SQL Error Code: 3966
// Transaction is rolled back when accessing version store. It was earlier marked as victim when the version store
// was shrunk due to insufficient space in tempdb. This transaction was marked as a victim earlier because it may need
// the row version(s) that have already been removed to make space in tempdb. Retry the transaction
case 3966:
// SQL Error Code: 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.
case 3960:
// SQL Error Code: 3957
// Snapshot isolation transaction failed in database '%.*ls' because the database did not allow snapshot isolation when
// the current transaction started. It may help to retry the transaction.
case 3957:
// SQL Error Code: 3953
// Snapshot isolation transaction failed in database '%.*ls' because the database was not recovered when the current
// transaction was started. Retry the transaction after the database has recovered.
case 3953:
// SQL Error Code: 3950
// Version store scan timed out when attempting to read the next row. Please try the statement again later when the system is not as busy.
case 3950:
// SQL Error Code: 3948
// The transaction was terminated because of the availability replica config/state change or because ghost records
// are being deleted on the primary and the secondary availability replica that might be needed by queries running under
// snapshot isolation. Retry the transaction.
case 3948:
// SQL Error Code: 3947
// The transaction was aborted because the secondary compute failed to catch up redo. Retry the transaction.
case 3947:
// SQL Error Code: 3941
// The transaction cannot modify an object that is published for replication or has Change Data Capture enabled
// because the transaction started before replication or Change Data Capture was enabled on the database. Retry the transaction.
case 3941:
// SQL Error Code: 3935
// A FILESTREAM transaction context could not be initialized. This might be caused by a resource shortage. Retry the operation.
case 3935:
// SQL Error Code: 3635
// An error occurred while processing '%ls' metadata for database id %d, file id %d, and transaction='%.*ls'.
// Additional Context='%ls'. Location='%hs'(%d). Retry the operation; if the problem persists,
// contact the database administrator to review locking and memory configurations.
// Review the application for possible deadlock conflicts.
case 3635:
// SQL Error Code: 3429
// Recovery could not determine the outcome of a cross-database transaction %S_XID, named '%.*ls',
// in database '%.*ls' (database ID %d:%d). The coordinating database (database ID %d:%d) was unavailable.
// The transaction was assumed to be committed. If the transaction was not committed, you can retry recovery
// when the coordinating database is available.
case 3429:
// SQL Error Code: 2816
// The metadata for object with id %d has changed. Retry the statement.
case 2816:
// SQL Error Code: 2021
// The referenced entity '%.*ls' was modified during DDL execution. Please retry the operation.
case 2021:
// SQL Error Code: 1807
// Could not obtain exclusive lock on database 'model'. Retry the operation later.
case 1807:
// SQL Error Code: 1535
// Cannot share extent %S_PGID. Shared extent directory is full. Retry the transaction. If the problem persists, contact Technical Support.
case 1535:
// SQL Error Code: 1534
// Extent %S_PGID not found in shared extent directory. Retry the transaction. If the problem persists, contact Technical Support.
case 1534:
// SQL Error Code: 1533
// Cannot share extent %S_PGID. The correct extents could not be identified. Retry the transaction.
case 1533:
// SQL Error Code: 1532
// New sort run starting on page %S_PGID found an extent not marked as shared. Retry the transaction.
// If the problem persists, contact Technical Support.
case 1532:
// SQL Error Code: 1438
// The server instance %ls rejected configure request; read its error log file for more information.
// The reason %u, and state %u, can be of use for diagnostics by Microsoft.
// This is a transient error hence retrying the request is likely to succeed. Correct the cause if any and retry.
case 1438:
// SQL Error Code: 1421
// Communications to the remote server instance '%.*ls' failed to complete before its timeout.
// The ALTER DATABASE command may have not completed. Retry the command.
case 1421:
// SQL Error Code: 1413
// Communications to the remote server instance '%.*ls' failed before database mirroring was fully started.
// The ALTER DATABASE command failed. Retry the command when the remote database is started.
case 1413:
// SQL Error Code: 1404
// The command failed because the database mirror is busy. Reissue the command later.
case 1404:
// SQL Error Code: 1232
// Failed to acquire lock with lock manager service, it could be due to many reasons including transient service failure.
case 1232:
// SQL Error Code: 1222
// Lock request time out period exceeded.
case 1222:
// SQL Error Code: 1221
// The Database Engine is attempting to release a group of locks that are not currently held by the transaction.
// Retry the transaction. If the problem persists, contact your support provider.
case 1221:
// SQL Error Code: 1216
// The DDL statement with ABORT_AFTER_WAIT = BLOCKERS option cannot be completed due to a conflicting system task. The request can abort only user transactions. Please wait for the system task to complete and retry.
case 1216:
// SQL Error Code: 1215
// A conflicting ABORT_AFTER_WAIT = BLOCKERS request is waiting for existing transactions to rollback.
// This request cannot be executed. Please retry when the previous request is completed.
case 1215:
// SQL Error Code: 1205
// Deadlock
case 1205:
// SQL Error Code: 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.
case 1204:
// SQL Error Code: 1203
// Process ID %d attempted to unlock a resource it does not own: %.*ls. Retry the transaction, because this error
// may be caused by a timing condition. If the problem persists, contact the database administrator.
case 1203:
// SQL Error Code: 997
// A connection was successfully established with the server, but then an error occurred during the login process.
// (provider: Named Pipes Provider, error: 0 - Overlapped I/O operation is in progress)
case 997:
// SQL Error Code: 988
// Unable to access database '%.*ls' because it lacks a quorum of nodes for high availability. Try the operation again later.
case 988:
// SQL Error Code: 982
// Unable to access the '%.*ls' database because no online secondary replicas are enabled for read-only access.
// Check the availability group configuration to verify that at least one secondary replica is configured for read-only access.
// Wait for an enabled replica to come online, and retry your read-only operation.
case 982:
// SQL Error Code: 952
// Database '%.*ls' is in transition. Try the statement later.
case 952:
// SQL Error Code: 941
// Database '%.*ls' cannot be opened because it is not started. Retry when the database is started.
case 941:
// SQL Error Code: 927
// Database '%.*ls' cannot be opened. It is in the middle of a restore.
case 927:
// SQL Error Code: 926
// Database '%.*ls' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server errorlog for more information.
case 926:
// SQL Error Code: 921
// Database '%.*ls' has not been recovered yet. Wait and try again.
case 921:
// SQL Error Code: 669
// The row object is inconsistent. Please rerun the query.
case 669:
// SQL Error Code: 617
// Descriptor for object ID %ld in database ID %d not found in the hash table during attempt to un-hash it.
// A work table is missing an entry. Rerun the query. If a cursor is involved, close and reopen the cursor.
case 617:
// SQL Error Code: 615
// Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again.
case 615:
// SQL Error Code: 601
// Could not continue scan with NOLOCK due to data movement.
case 601:
// SQL Error Code: 539
// Schema changed after the target table was created. Rerun the Select Into query.
case 539:
// SQL Error Code: 233
// The client was unable to establish a connection because of an error during connection initialization process before login.
// Possible causes include the following: the client tried to connect to an unsupported version of SQL Server;
// the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum
// allowed connections) on the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by
// the remote host.)
case 233:
return true;
// SQL Error Code: 203
// A connection was successfully established with the server, but then an error occurred during the pre-login handshake.
// (provider: TCP Provider, error: 0 - 20) ---> System.ComponentModel.Win32Exception (203): Unknown error: 203
case 203:
if (ex.InnerException is Win32Exception)
{
return true;
}
continue;
// SQL Error Code: 121
// The semaphore timeout period has expired
case 121:
// SQL Error Code: 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.)
case 64:
// DBNETLIB Error Code: 20
// The instance of SQL Server you attempted to connect to does not support encryption.
case 20:
return true;
// This exception can be thrown even if the operation completed successfully, so it's safer to let the application fail.
// DBNETLIB Error Code: -2
// Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. The statement has been terminated.
//case -2:
}
}
return false;
}
return ex is TimeoutException;
}
}