적용 대상: .NET Framework
.NET .NET
Standard
구성 가능한 재시도 논리(CRL)를 사용하면 Microsoft.Data.SqlClient에서 일시적 오류가 발생한 후 선택된 SqlCommand 및 SqlConnection 작업을 다시 시도할 수 있습니다. 어떤 오류가 해당되는지, 몇 번의 시도를 할지, 시도 간 지연 속도, 그리고 어떤 명령어를 반복해도 안전한지 선택할 수 있습니다.
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() 하지 않습니다.
ConnectTimeout 및 CommandTimeout는 각각 단독으로 해당 작업을 수행할 수 있을 만큼 충분히 오래 지속되어야 합니다.
이 조건은 자동 일시정지가 활성화된 Azure SQL Database의 Serverless 컴퓨트 계층에서 가장 중요합니다. 자동 일시정지된 데이터베이스는 첫 번째 Open(), 에서 재개되며, 이력서는 30초에서 60초 이상 걸릴 수 있습니다. 대상이 자동으로 일시 중지될 수 있는 경우 ConnectTimeout를 60초 이상으로 늘리세요. 재시도 논리는 데이터베이스가 온라인에 들어가는 동안 남은 과도 장애(예: 40613, 40197, , ) 40501를 처리합니다.