복붙노트

[SQL] (SQL에서) COMMIT 문은 지금까지 실패 할 수 있습니까? 어떻게?

SQL

(SQL에서) COMMIT 문은 지금까지 실패 할 수 있습니까? 어떻게?

데이터베이스 트랜잭션 작업 할 때, 최종 트랜잭션 내의 모든 문은 이미 문제없이 실행 염치, 실패 트랜잭션의 COMMIT 문을 야기 가능한 조건 (있는 경우) 무엇인가?

예를 들어 ...의 당신이 그것을 마지막으로 트랜잭션을 커밋 괜찮 때 약간의 마스터 프로세스가 당신에게 들어 기다립니다 당신이 진술 한 무리을 약 2 단계 또는 3 단계 커밋 프로토콜을 가정 해 봅시다 :

-- <initial handshaking stuff>
START TRANSACTION;
-- <Execute a bunch of SQL statements>
-- <Inform master of readiness to commit>
-- <Time passes... background transactions happening while we wait>
-- <Receive approval to commit from master (finally!)>
COMMIT;

코드가 최종 COMMIT 문에 도달하고 DBMS로 전송하면, 혹시 그 진술에서 (데이터베이스 전체 고유성 문제 등) 오류를받을 수 있나요? 어떤 오류? 왜? 그들은 어떻게 나타 납니까? 당신이 실행 DBMS 내용에 따라 달라질 수 있습니까?

해결법

  1. ==============================

    1.실패 할 수 있습니다 COMMIT. 당신은 당신이 만드는 것을 바란 모든 변경 사항을 기록 할 수있는 충분한 자원을 가지고 있지만, 실제로 변경 사항을 구현하기 위해 자원이 부족했을 수 있습니다.

    실패 할 수 있습니다 COMMIT. 당신은 당신이 만드는 것을 바란 모든 변경 사항을 기록 할 수있는 충분한 자원을 가지고 있지만, 실제로 변경 사항을 구현하기 위해 자원이 부족했을 수 있습니다.

    그리고는 실패 할 수 있습니다 다른 이유를 고려하지 않고있다 :

    그리고 내 머리 꼭대기에없는 다른 모든 "간단한"이유.

  2. ==============================

    2.그것은 COMMIT까지 연기 UNIQUE 인덱스 제약 조건 검사에 일부 데이터베이스 엔진 가능합니다. 제약 커밋시 성립하지 않는 분명히 경우 다음 오류가 발생합니다.

    그것은 COMMIT까지 연기 UNIQUE 인덱스 제약 조건 검사에 일부 데이터베이스 엔진 가능합니다. 제약 커밋시 성립하지 않는 분명히 경우 다음 오류가 발생합니다.

  3. ==============================

    3.확실한.

    확실한.

    다중 사용자 환경에서,이 때문에 다른 사용자가 변경되지 않을 수 COMMIT (예를 들어, 당신의 지금 현재 데이터베이스에 적용 할 때 ... 참조 제한 조건을 위반하는 COMMIT).

    도마

  4. ==============================

    4.물론, 여러 문제가있을 수 있습니다. 그 자체, 커밋의 행위는, 트랜잭션이 최선을 다하고 있음을 나타내는 몇 가지 최종 영구 항목을해야합니다. 해당 항목을 만드는 것은 실패하면 트랜잭션은 커밋 할 수 없습니다.

    물론, 여러 문제가있을 수 있습니다. 그 자체, 커밋의 행위는, 트랜잭션이 최선을 다하고 있음을 나타내는 몇 가지 최종 영구 항목을해야합니다. 해당 항목을 만드는 것은 실패하면 트랜잭션은 커밋 할 수 없습니다.

    이그나시오는 상태로, 제약 조건 검사를 (이것은 DBMS 엔진에 따라 제약의 어떤 형태뿐만 아니라 고유 제한 될 수 있음)이 연기 될 수 있습니다.

    SQL 서버 별 : 시간을 커밋 할 때까지 플러싱 FILESTREAM 데이터가 지연 될 수 있습니다. 즉 실패 할 수 있습니다.

  5. ==============================

    5.하나는 매우 간단하고 종종 간과 항목 : 하드웨어 오류가 발생했습니다. 는 기본 서버 죽으면 실패 할 수 있습니다 커밋합니다. 이것은 디스크, CPU, 메모리, 또는 관련 심지어 네트워크가 될 수 있습니다.

    하나는 매우 간단하고 종종 간과 항목 : 하드웨어 오류가 발생했습니다. 는 기본 서버 죽으면 실패 할 수 있습니다 커밋합니다. 이것은 디스크, CPU, 메모리, 또는 관련 심지어 네트워크가 될 수 있습니다.

    은 (여러가지 이유로) 마스터로부터 승인을받지 못할 경우, 트랜잭션이 실패 할 수 있습니다.

  6. ==============================

    6.당신이 사용하는 경우 두 단계는 더, 커밋하지 않습니다. 잘못 될 수있는 모든 준비 단계에서 이루어집니다.

    당신이 사용하는 경우 두 단계는 더, 커밋하지 않습니다. 잘못 될 수있는 모든 준비 단계에서 이루어집니다.

    이 커밋 동안 여전히, 네트워크 중단, 전력 이하, 우주선 등이 될 수 있지만, 그럼에도 불구하고, 거래는 영구 저장 장치에 기록 된 것, 그리고이 트리거 된 커밋 경우, 복구 프로세스를 통해 수행해야합니다.

    바라 건데.

  7. ==============================

    7.시스템을 설계 할 수있는 방법 멋지고 상관없이, A는 그것이 성공 여부를 알고 불가능 상황에 얻을 것이다 커밋 몇 가지 가능성이있을 것입니다. 경우에 따라서는 문제가되지 않을 수 있습니다 (예를 들어, 슬래그 더미로 데이터베이스 회전을 잡고 하드 드라이브, 그것은 그가 발생하기 전에 성공 여부를 커밋 여부를 알 수 없습니다 할 수 있지만 경우는 정말 문제 것); 다른 사람의 경우에, 그러나,이 문제가 될 수 있습니다. 연결 실패가 커밋 동안 단지 적절한 시간에 발생하면 양측이 상대방이 커밋 또는 롤백 기대되어 있는지 여부를 확신 할 수 있도록 특히 분산 데이터베이스 시스템, 그것은 불가능하다.

    시스템을 설계 할 수있는 방법 멋지고 상관없이, A는 그것이 성공 여부를 알고 불가능 상황에 얻을 것이다 커밋 몇 가지 가능성이있을 것입니다. 경우에 따라서는 문제가되지 않을 수 있습니다 (예를 들어, 슬래그 더미로 데이터베이스 회전을 잡고 하드 드라이브, 그것은 그가 발생하기 전에 성공 여부를 커밋 여부를 알 수 없습니다 할 수 있지만 경우는 정말 문제 것); 다른 사람의 경우에, 그러나,이 문제가 될 수 있습니다. 연결 실패가 커밋 동안 단지 적절한 시간에 발생하면 양측이 상대방이 커밋 또는 롤백 기대되어 있는지 여부를 확신 할 수 있도록 특히 분산 데이터베이스 시스템, 그것은 불가능하다.

  8. from https://stackoverflow.com/questions/3960189/can-a-commit-statement-in-sql-ever-fail-how by cc-by-sa and MIT license