트랜잭션이 "커밋"된 경우 확실하게 저장됩니까?


12

트랜잭션이 성공적으로 커밋 된 경우 데이터베이스와 로그 파일에 트랜잭션이 기록되었는지 100 % 확신 할 수 있습니까? 데이터가 저장되었는지 확인할 수 있습니까?

오늘 로그 파일이 드라이브의 한계에 도달했으며 많은 오류가 발생했습니다. 또한 일부 다른 서비스가 중단되었습니다. 디스크를 늘리고 서버를 다시 시작했습니다.

시작하는 동안 서버가 "데이터베이스 복구"를 수행했습니다. 모든 것이 다시 정상인지 확신 할 수 있습니까?


2
복구가 완료된 후 오류 로그를 확인하여 커밋 된 트랜잭션 수와 롤백 된 수를 확인할 수 있습니다. 이것에 대한 마법의 대답은 없습니다-디스크가 추락하면 그 당시의 트랜잭션 상태에 따라 다릅니다.
Aaron Bertrand

1
@AaronBertrand 그러나 트랜잭션이 "커밋 된"상태 (즉, 커밋에 성공한 경우)에서 복구 중에 여전히 손실 될 수있는 방법은 무엇입니까?
SQL Police

3
@Giosco : 할 수 없습니다. "committed"는 데이터베이스의 로그 파일에 있음을 의미합니다. 그 후 유실하는 유일한 방법은 1) 데이터 파일에 저장되기 전에 로그 파일을 잃어 버리거나 2) 로그 파일과 데이터 파일을 모두 잃어 버리거나 3) 사람의 실수를 잃는 것입니다. 일반적으로 (3)이 가장 비슷합니다.
RBarryYoung

2
@Giosco 전체 드라이브 시점의 모든 거래가 성공적으로 완료되었음을 어떻게 알 수 있습니까?
Aaron Bertrand

2
저장 프로 시저 <> 트랜잭션-저장 프로 시저에는 여러 개의 명시 적 트랜잭션이 있거나 암시 적으로 만 시도 / 캐치 논리가있을 수 있으며 C # 계층에서 트랜잭션 처리가있을 수 있습니다. 담요 진술로 너무 위험 할 수 있습니다.
Aaron Bertrand

답변:


16

클라이언트 애플리케이션이 COMMIT를 발행하고 성공 코드를 리턴 한 경우 엔진이 트랜잭션을 내구성으로 보장합니다. 충돌 후에도 트랜잭션에서 수행 된 모든 변경 사항을 볼 수 있습니다. 또한 복구는 커밋되지 않은 트랜잭션이 충돌시 롤백되도록 보장합니다.

자세한 내용은 ARIES 용지를 읽는 것이 좋습니다 .

기본 스토리지 하드웨어에 결함 (손상)이있는 경우 미리 쓰기 로깅 및 복구를 보장 할 수 없습니다. 모든 엔지니어링 제품에는 결함이있을 수 있습니다.

충돌 (오류)이있을 때 올바르게 작동하려면 다른 모든 응용 프로그램과 마찬가지로 응용 프로그램을 신중하게 작성해야합니다. 마법이 없습니다.


클라이언트 애플리케이션이 COMMIT를 발행했지만 클라이언트 측에서 시간 종료 될 때까지 DB로부터 응답을받지 못한 경우. 이 커밋은 어떻습니까? 성공 또는 실패? 확인하는 방법?
Gab 是 好人
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.