2012-10-12 3 views
3

오랜 작동 중에 연결이 끊어지면 어떻게됩니까?오라클 연결 해제 동작

예를 들어 완료하는 데 몇 분이 걸리는 선택문이 있으며 실행 중에 연결이 끊어집니다. 실행이 계속되거나 중단 될 것입니까?

delete 문 : 클라이언트가 연결을 끊으면 종료되거나 중단됩니까? 데이터는 어떻게됩니까? 곧 커밋되거나 롤백 될 것인가?

ddl 작업의 경우 : alter table tbl_name move 작업이 오래 실행되었습니다. 클라이언트의 연결이 끊어지면 어떻게됩니까? 실행이 계속되거나 중단 될 것입니까?

+1

[ 'ACID'] (http://en.wikipedia.org/wiki/ACID) 속성을 읽으십시오. 그것은 "All or nothing"이라고 말합니다. – Annjawn

답변

4

나는 클라이언트 응용 프로그램과 비슷한 것에 대해 이야기하고 있다고 가정합니다 또는 문이 실행되는 동안 트랜잭션이 열려있는 동안 클린 연결 끊기를 수행 할 수 없기 때문에 응용 프로그램이 클린 연결을 끊는 상황보다 네트워크 연결이 끊어지는 경우가 있습니다.

일반적으로 명령문은 서버에서 완료 될 때까지 실행됩니다 (여기서 SELECT의 "완료"는 클라이언트가 요청한 첫 번째 행 집합을 반환 할 수있는 지점입니다. 그 전체). 그런 다음 서버는 결과가 클라이언트에 준비되었음을 알리는 통신을 시도합니다.응답을받지 못하면 (클라이언트가 ACK 패킷을 기다리는 데 몇 분이 소요될 수 있음) 클라이언트 프로세스가 작동을 멈추고 커밋되지 않은 트랜잭션을 롤백하는 프로세스를 시작한다는 것을 알 수 있습니다 (모든 잠금을 해제합니다). 거래가 보유하고 있음). 거래의 일부로 데이터베이스를 변경 한 경우 (즉, 삽입, 업데이트 및/또는 삭제를 완료 한 경우) 변경 사항을 롤백하는 데 시간이 오래 걸릴 수 있습니다.

0

모든 데이터베이스 작업은 ACID 속성에 따라 작동합니다.

Atomicity 

데이터에 대한 모든 변경은 단일 작업 인 것처럼 수행됩니다. 즉, 모든 변경 사항이 수행되거나 변경 사항이 없습니다.
이는 원 자성에 따라 변경 내용이 롤백됨을 의미합니다.

+0

더 까다로운 부분은 "언제"입니다. 오라클은 연결이 끊어 졌다는 것을 정확히 파악하지 못하는 것 같습니다. – Luaan

1

selectdelete과 같은 간단한 DML 문의 경우 트랜잭션은 롤백되거나 커밋됩니다.

"언제"가 발생합니까? 사실 상관 없습니다. 다른 클라이언트는 커밋 된 트랜잭션의 결과 만 볼 수 있으므로 타이밍은 중요하지 않습니다.

the official docs에 따르면 DDL 문의 경우 "암시 적 COMMIT은 데이터베이스가 DDL 문을 실행하고 즉시 COMMIT 또는 ROLLBACK이 발생하기 직전에 발생합니다".

트랜잭션 내에서 일부 DML 문과 DDL 문을 수행하는 경우 DML 문은 커밋 될 수 있지만 DDL 문은 모두 동일한 트랜잭션에 있더라도 롤백됩니다.

간단한 예를 들어 보겠지만 모두 또는 전부입니다. ... 일반적으로 커밋 된 트랜잭션에 대한 확인을 받기 전에 연결이 끊어지면 실제로 성공했는지 여부는 알 수 없습니다. 확인을해야합니다.

[편집 : 단지 (명시 적 또는 암시 적으로) 당신이 "커밋"데이터베이스를 전송 한 경우 확인해야 ...를 "당신이 확인해야"에 약간 정교, 당신은 잃게하는 방법 데이터베이스가 커밋을 수행했는지 여부를 알기 전에 연결을 확인하십시오.
커밋을 실행하기 전에 연결이 끊어지면 롤백 될 것임을 보증 할 수 있습니다. (위의 DDL 경고와 함께)

+1

장시간 실행되는'INSERT','UPDATE' 또는'DELETE' 문이 트랜잭션을 롤백함으로써 해제 될 필요가있는 잠금을 획득 할 때 "언제"가 문제가 될 수 있습니다. 당신이 말하는 다중 버전 읽기 일관성 때문에 쿼리에는 문제가되지 않습니다. 그러나 누군가 다른 세션에서 장기 실행 작업을 다시 시작해야하는 경우 중요합니다. –