문제

우선 순위가 낮은 데이터를 삽입하면서 오류에도 불구하고 트랜잭션을 계속 실행할 수있는 방법을 찾고 있습니다. 실제 중첩 트랜잭션은 솔루션이 될 수있는 것처럼 보이지만 SQL Server 2005/2008에서는 지원되지 않습니다. 또 다른 해결책은 오류가 중요한지 여부를 결정하는 논리를 갖는 것이지만, 그럴 수없는 것 같습니다.

내 시나리오에 대한 자세한 내용은 다음과 같습니다.

데이터는 ado.net/c#을 사용하여 데이터베이스에 정기적으로 삽입되며 일부는 중요하지만 일부는 문제없이 누락 될 수 있습니다. 인서트가 완료되면 데이터에 일부 계산이 이루어집니다. (활력과 비 생생한)이 전체 프로세스는 트랜잭션 내부에 있으므로 모든 것이 동기화되어 있습니다.

현재 트랜잭션 저장 포인트가 사용되며, 비 생생한 인서트 중에 발생하는 예외에 대한 부분 롤백이 이루어집니다. 그러나 이는 "Batch-Abort"오류에 대해서는 작동하지 않으며, 이는 전체 트랜잭션을 자동으로 롤백합니다. 일부 오류가 중요하다는 것을 이해하지만 SQL Server에 의해 실패한 캐스트와 같은 것은 배치-아버트 오류로 간주됩니다. (배치 오류에 대한 정보) 우선 순위가 낮은 데이터에서 발생하면 이러한 오류가 전체 삽입물을 중단하지 않도록 노력하고 있습니다.

내가 설명하는 것이 불가능하다면, 나는 데이터 무결성을 달성하기위한 대체 방법을 기꺼이 고려하지만 비 생물 삽입물의 실패를 허용하려고합니다.

당신의 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

불행히도, 당신이 설명 할 수 있듯이 할 수 없습니다 (중첩 거래에 대한 모든 지원이 핵심이 될 것입니다). 내가 생각할 수있는 몇 가지 사항은 과거 에이 문제를 해결하는 데 사용되었습니다.

  1. 최상의 옵션은 아마도 명령을 뚜렷하게 실행할 수있는 중요한/중요하지 않은 명령으로 분리하는 것입니다. 당연히 서로 주문에 의존하지 않아야합니다.

  2. 메시징 기반 접근법을 사용할 수도 있습니다 (참조 서비스 중개인) 기본 명령을 인라인으로 실행하고 비 프리전스 명령을 큐에 푸시하여 나중에/개별적으로 실행할 수 있습니다. 대기열로의 푸시는 배치 내에서 트랜잭션이되지만 대기열에서 팝업 할 때 명령의 실행은 별도입니다. 이것은 또한 서로 주문에 의존하지 않아야합니다.

  3. 순서 의존적이라면 모든 것에 대한 메시징 접근 방식을 사용할 수 있습니다.이 방법은 순서를 보장하고 작업 당 별도의 메시지를 가질 수있는 경우 (대화 그룹을 통해) 함께 그룹화 할 수 있습니다. 각 '유형'의 운영에 대해 별도의 트랜잭션 (예 : 기본 대 비 예정). 그룹화 된 모든 메시지가 단일 자율 연산이어야하지만 수행 할 수있는 경우 특별한 코딩이 필요합니다.

  4. 이 옵션은 끔찍한 선택이기 때문에이 옵션을 언급하는 것을 망설입니다. 그러나 전체 공개를 위해서는 그것이 적합하다고 생각되면 재량에 따라 고려할 수 있다고 생각합니다 (그러나 거의 모든 시나리오에 적용되는 아키텍처는 아닙니다). XP_CMDSHELL을 사용하여 명령 줄을 호출하고 비정상적인 작업을 위해 SQLCMD/OSQL을 실행할 수 있습니다. 계속할 배치.

그것들은 몇 가지 아이디어입니다 ...

다른 팁

중요한 부품에 대해서만 거래를 사용하여 수입을 임시 위치로 수행 할 수 있습니까? 임시 위치가로드 된 후 비 임계 오류를 흡수 한 후 단일 트랜잭션에서 데이터를 최종 대상으로 복사 할 수 있습니다. 당신이하고있는 일의 본질에 따라 다르지만 잠재적으로 실행 가능한 옵션에 따라 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top