문제

트랜잭션 방식으로 삽입, 업데이트, 명령문 삭제 세트를 실행하는 DotNet Applicaton이 있습니다.

코드는 다음과 같습니다

try
{
mytrans = mycon.begintransaction();
//execute sql statements
mytrans.commit();
}
catch(Exception)
{
mytrans.rollback();
}

문제는 때때로 우리가 롤백에서 시간 초과 예외에 직면하고 데이터베이스 크기 (MDF 파일)가 증가했다는 것을 알았습니다 !!! 따라서 SQL이 암시 적 롤백을 만들지 않을 것임을 의미합니까? 그렇다면이 오류에서 어떻게 복구하고 원래 상태로 이동할 수 있습니까 ???

도움이 되었습니까?

해결책

거래의 기본 개념은 커밋되지 않은 거래가 데이터베이스의 상태에 영향을 미치지 않도록 요구합니다.

파일 크기는 아무 의미가 없습니다. RDBMS 데이터 구조는 단순히 파일에 줄을 추가하는 것보다 훨씬 복잡합니다. 로그 및 지수를 포함하므로 파일이 DB의 데이터 양과 독립적으로 성장하고 줄어들 수 있습니다.

다른 팁

실행되었을 수있는 SQL은 아직 커밋되지 않았습니다. 어떤 이유로 롤백이 발생하지 않는 경우 커밋되지 않습니다. 따라서 결국 DB는 모든 사라진 배를 깨닫고 변경 사항을 버릴 것입니다.

MDF 크기의 증가는 거래가 저지른 것을 나타내는 것이 아닙니다. 그러나 거래 결과는 어딘가에 넣어야합니다. 거래의 커밋은 DB에서 가능한 가장 작은 변화를 요구해야합니다. 따라서 페이지를 할당하고 데이터를 작성한 다음 모든 올바른 장소를 가리키는 몇 가지 다른 비트 만 조정할 수 있습니다.

롤백이 있다면 마지막 몇 비트가 조정되지 않으며 할당 된 페이지는 단순히 다른 것들에 사용되도록 무료 페이지가됩니다. DB가 다시 수축 할 것으로 기대할 수 없습니다.

페이지 슬릿은 롤백에서 살아남을 수 있습니다.

http://sqlfool.com/2009/04/page-splitting-rollbacks/

롤백이 시작되면 완료해야합니다. 여전히 연결되어 있든 없든 SQL Server는 여전히 롤백을 완료합니다. 롤백을 완료하지 못하면 데이터베이스 트랜잭션 부패가 손상되고 복구가 필요합니다.

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