SqlClient의 구성 가능한 다시 시도 논리

적용 대상: .NET Framework .NET .NET Standard

ADO.NET 다운로드

구성 가능한 재시도 논리(CRL)를 사용하면 Microsoft.Data.SqlClient에서 일시적 오류가 발생한 후 선택된 SqlCommandSqlConnection 작업을 다시 시도할 수 있습니다. 어떤 오류가 해당되는지, 몇 번의 시도를 할지, 시도 간 지연 속도, 그리고 어떤 명령어를 반복해도 안전한지 선택할 수 있습니다.

CRL은 기본적으로 꺼져 있습니다. 연결, 명령 또는 둘 다에 제공자를 할당함으로써 활성화할 수 있습니다. 두 제공자는 독립적입니다: 제공자를 연결에 할당한다고 해서 그 연결에서 생성된 명령에 적용되지 않습니다.

참고

CRL은 Microsoft.Data.SqlClient 3.0 이상에서 사용할 수 있습니다. 기본값은 SqlConfigurableRetryFactory.CreateNoneRetryProvider이며, 재시도하지 않습니다.

CRL이 재시도하는 항목

Scenario 제공자를 할당합니다 일반적인 고장
연결을 열어 SqlConnection.RetryLogicProvider 장애 조치, 속도 제한, 데이터베이스의 잠시 사용 불가, 연결 설정 중 전송 실패.
명령 실행 SqlCommand.RetryLogicProvider 트랜잭션 외부에서 반복해도 안전한 선택된 명조 실패.

SQL Server, Azure SQL Database, Azure SQL Managed Instance, Microsoft Fabric의 SQL 데이터베이스 및 Azure Synapse Analytics의 전용 SQL 풀 전체에서 재시도 대상인 공통 연결 오류 목록은 Built-in transient error list를 참조하세요.

구성 경로를 선택하세요

과업 조항
코드로 제공자를 생성하고 할당하세요 SqlClient에서 재시도 로직을 구성
고정, 증분, 지수, 재시도 없는 제공자를 비교하세요 SqlClient에 내장된 재시도 로직 제공자
구성 파일에서 애플리케이션 전체 기본값을 설정하세요 구성 파일로 SqlClient 재시도 로직을 구성하세요
사용자 지정 간격, 오류 판별자 또는 제공자를 구현하세요 SqlClient용 커스텀 재시도 제공자 생성

안전한 재시도 정책 설계

  • 애플리케이션 입력을 변경하지 않고도 해결될 가능성이 높은 실패만 재시도하세요.
  • 재시도는 시도 횟수와 최대 지연 시간을 기준으로 제한합니다. 무한정 재시도 루프는 정전을 지속적인 부하로 바꿀 수 있습니다.
  • 를 초기 연산을 포함한 총 시도 횟수로 간주 NumberOfTries 합니다.
  • 지터를 추가해서 많은 클라이언트가 동시에 재시도하지 못하게 합니다. 내장 프로바이더는 자동으로 지터를 추가합니다.
  • 트랜잭션 내부의 개별 문 하나가 아니라 전체 트랜잭션을 다시 시도하세요. 내장 명령 제공자는 활성 트랜잭션이 있는 연결에서 명령을 재시도하지 않습니다.
  • 명령 재시도는 멱등 작업 또는 애플리케이션 수준의 멱등성 메커니즘으로 보호되는 작업으로 제한하세요.
  • 복구된 일시적 고장과 지속적인 사고를 구분할 수 있도록 이벤트를 Retrying 기록하세요.

일반적인 아키텍처 지침은 재시도 패턴을 참조하세요. Azure SQL 오류 지침은 일시적인 오류를 참조하세요.

클라이언트 측 타임아웃과 서버리스 재개

CRL은 드라이버가 실제로 받는 오류만 재시도합니다. 클라이언트 측 타임아웃은 오류 -2로 나타나는데, 이는 내장된 과도 오류 목록에 없기 때문에, 내장 제공자들이 클라이언트 타임아웃에 도달한 명령어를 다시 시도 Open() 하지 않습니다. ConnectTimeoutCommandTimeout는 각각 단독으로 해당 작업을 수행할 수 있을 만큼 충분히 오래 지속되어야 합니다.

이 조건은 자동 일시정지가 활성화된 Azure SQL Database의 Serverless 컴퓨트 계층에서 가장 중요합니다. 자동 일시정지된 데이터베이스는 첫 번째 Open(), 에서 재개되며, 이력서는 30초에서 60초 이상 걸릴 수 있습니다. 대상이 자동으로 일시 중지될 수 있는 경우 ConnectTimeout를 60초 이상으로 늘리세요. 재시도 논리는 데이터베이스가 온라인에 들어가는 동안 남은 과도 장애(예: 40613, 40197, , ) 40501를 처리합니다.