2010-02-22 1 views
1

ADO.NET의 SqlCommand를 사용하여 사용자가 제공 한 여러 T-SQL 문의 일괄 처리를 실행하는 프로그램을 작성하고 있습니다.T-SQL 문이 응용 프로그램 시작 트랜잭션을 커밋하지 못하도록합니다.

내 응용 프로그램의 모든 문장이 하나를 실행에 에러가 발생했을 경우, 전체 많이 롤백되는 것을 보장하기 위해 실행되는 트랜잭션을 엽니 다.

나는 가로 질러 온 문제

심하게 배치가 SQL 내 모든 중요한 트랜잭션을 커밋 및 롤백 할 날이없는 떠나 제공 한 사용자 (일치하지 않고 TRAN을 BEGIN) COMMIT 것입니다.

은 아무도 내 거래 덤비는에서 사용자의 SQL을 중지 할 수있는 방법 어떤 아이디어를 가지고 있지만 여전히 그들을/BEGIN/자신의 중첩 된 트랜잭션을 롤백 COMMIT 할 수 있습니까

? 당신이 다음 T-SQL 것을 실행하는 잠재적 인 문제를 플래그 할 수 있도록

답변

1

당신은 distributed transaction에서 SqlCommand에 입대 할 수있다. COMMIT 문은 데이터베이스에 커밋 될 수 없습니다. Connection 개체의 EnlistDistributedTransaction 메서드를 참조하십시오.

분산 트랜잭션은 완전히 새로운 수준의 성능 및 안정성 문제를 도입합니다. AdaTheDev가 제안한 것과 같은 T-SQL 배치를 수정할 수 있다면 훨씬 더 나은 옵션이 될 것입니다.

1

당신은 프로그래밍, 단어가 COMMIT의하는 SqlCommand에로드되는 각 T-SQL 문에서도를 확인할 수 있습니다.

어딘가 수동으로 살펴볼 수 있도록 보관 해주세요.

+0

이것은 처음 생각했지만 SQL을 구문 분석하고 중첩 된 트랜잭션을 허용하는 것은 간단합니다. – rnwood

5

사용자의 SQL은 수정 될 필요가 - 그것은 심하게 확약 (또는 롤백) 배치 한 경우는, 그때 그 수정해야 버그로 클래스를 것입니다. 나는 당신의 시나리오의 세부 사항에 대해 많이 알지 못하지만, 이것이 당신이해야 할 일이라고 생각합니다. 해결 방법을 구현하려는 경우, 경보 벨이 울리기 시작해야 시스템이 더 복잡해 지거나 유지하기가 더 어려워집니다.

+0

전적으로이 문제에 전적으로 동의합니다. 예, 사용자 SQL이 실제 문제이며 해결 방법이 적합하지 않습니다. 불행히도 제 시나리오에서는 이러한 오류를 용인 할 수 있어야합니다. 이상적인 세상에서는 @kevchadders의 대답에 따라 실행하기 전에 사용자 SQL을 구문 분석하고 이러한 문제를 확인하지만 내 감정은 너무 어렵습니다. – rnwood

+0

@Robert Wood - Andomar의 제안을 살펴 봐야 할 것 같습니다. SQL을 파싱하면 웜이 될 수 있습니다. 내가 제안 할 수있는 유일한 다른 옵션은 지금하는 것처럼 계속 수행하고 문제를 일으키는 옵션을 로그 아웃하는 것입니다. – AdaTheDev

관련 문제