이 문서는 지원되지 않는 배트맨 토토 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.토토 사이트 추천 : 문서 : 17 : 3.4. 업무버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

3.4. 거래

거래기본 개념입니다. 모든 데이터베이스 시스템의 거래의 핵심은 여러 단계를 하나의 전부 아니면 전무로 묶어줍니다. 운영. 단계 사이의 중간 상태는 다른 동시 트랜잭션에 표시되며, 일부 오류가 발생한 경우 트랜잭션이 완료되지 못하게 하는 문제가 발생하면 다음 중 어느 것도 발생하지 않습니다. 단계는 데이터베이스에 전혀 영향을 미치지 않습니다.

예를 들어, 다음에 대한 잔액이 포함된 은행 데이터베이스를 생각해 보십시오. 다양한 고객 계좌 및 총 입금액 가지. 우리가 $100.00의 지불을 기록하려고 한다고 가정합니다. Alice의 계정을 Bob의 계정으로 변경합니다. 엄청나게 단순화된 SQL 이에 대한 명령은 다음과 같습니다.

UPDATE 계정 SET 잔액 = 잔액 - 100.00
    WHERE 이름 = '앨리스';
UPDATE 분기 SET 잔액 = 잔액 - 100.00
    WHERE 이름 = (SELECT Branch_name FROM 계정 WHERE 이름 = 'Alice');
UPDATE 계정 SET 잔액 = 잔액 + 100.00
    WHERE 이름 = '밥';
UPDATE 분기 SET 잔액 = 잔액 + 100.00
    WHERE 이름 = (SELECT Branch_name FROM 계정 WHERE 이름 = 'Bob');

이 명령의 세부사항은 여기서 중요하지 않습니다. 는 중요한 점은 여러 가지 별도의 업데이트가 관련되어 있다는 것입니다. 이 다소 간단한 작업을 수행합니다. 우리은행 직원들 이러한 모든 업데이트가 발생하는지 확인하고 싶거나 그 중 아무 일도 일어나지 않습니다. 시스템 오류에는 확실히 해당되지 않습니다. 결과적으로 Bob은 Alice에게서 인출되지 않은 $100.00를 받게 됩니다. 앨리스가 인출된다면 오랫동안 행복한 고객으로 남지 않을 것입니다. Bob이 인정받지 못한 채. 우리는 어떤 것이 있다면 보장이 필요합니다 작업 도중에 오류가 발생하고 어떤 단계도 수행되지 않습니다. 지금까지 실행된 내용이 적용됩니다. 업데이트를 a로 그룹화거래이런 보증을 제공합니다. 에이 거래가 다음과 같다고 합니다원자: 에서 다른 거래의 관점에서는 완전히 발생하거나 아니면 전혀.

또한 거래가 완료되면 보장을 원합니다. 그리고 데이터베이스 시스템에서 이를 인식한 것은 실제로 영구적으로 기록되며 충돌이 발생하더라도 손실되지 않습니다. 그 직후. 예를 들어 현금으로 기록하는 경우 Bob이 인출한 경우, 우리는 그의 인출이 발생할 가능성을 원하지 않습니다. 그가 은행에서 나간 직후 사고로 계좌가 사라질 것입니다. 문. 트랜잭션 데이터베이스는 모든 업데이트가 이루어지도록 보장합니다. 트랜잭션에 의해 영구 저장소(예: 디스크)에 기록됩니다. 거래가 완료되었다고 보고되기 전에.

트랜잭션 데이터베이스의 또 다른 중요한 속성은 다음과 같습니다. 원자 업데이트 개념과 관련: 여러 트랜잭션이 있을 때 동시에 실행 중이면 각각이 볼 수 없어야 합니다. 다른 사람이 수행한 불완전한 변경. 예를 들어, 하나의 거래가 있는 경우 모든 지점 잔액을 합산하느라 바쁘지만 그럴 수는 없습니다. Alice 지점의 차변은 포함하되 다음 지점의 대변은 포함하지 않습니다. Bob의 지점이거나 그 반대의 경우도 마찬가지입니다. 그래서 거래는 반드시 전부 아니면 전무(all-or-no)의 문제는 그것이 영구적인 영향을 미친다는 점에서 뿐만 아니라 데이터베이스뿐만 아니라 발생 시 가시성 측면에서도 그렇습니다. 는 공개 트랜잭션을 통해 지금까지 수행된 업데이트는 다른 사용자에게 표시되지 않습니다. 거래가 완료될 때까지 거래가 완료됩니다. 업데이트가 동시에 표시됩니다.

배트맨 토토, 거래는 트랜잭션의 SQL 명령을 다음으로 둘러싸서 설정합니다.시작그리고커밋명령. 따라서 은행 거래는 실제로 다음과 같습니다.

시작;
UPDATE 계정 SET 잔액 = 잔액 - 100.00
    WHERE 이름 = '앨리스';
-- 기타 등등
커밋;

만약 거래 도중에 거래를 원하지 않는다고 결정한 경우 커밋(아마도 우리는 Alice의 잔액이 음수), 명령을 내릴 수 있습니다.롤백대신커밋, 지금까지의 모든 업데이트가 취소됩니다.

포스트그레SQL실제로 치료합니다 모든 SQL 문은 배트맨 토토 내에서 실행됩니다. 당신이 발행하지 마십시오.시작명령을 내린 다음 각각 개별 문에는 암시적인 내용이 있습니다.시작및 (성공한 경우)커밋둘러싸여 있음 그것. 로 둘러싸인 명령문 그룹시작그리고커밋입니다 때로는 a라고도 함거래 차단.

참고:일부 클라이언트 라이브러리 문제시작그리고커밋명령 자동으로 거래의 효과를 얻을 수 있도록 묻지 않고 차단합니다. 인터페이스에 대한 설명서를 확인하세요. 당신은 사용하고 있습니다.

트랜잭션의 명령문을 제어하는 것이 가능합니다. 다음을 사용하여 더욱 세분화된 방식으로 처리됩니다.저장점. 저장점을 사용하면 선택적으로 다음을 수행할 수 있습니다. 트랜잭션의 일부를 버리고 나머지는 커밋합니다. 이후 다음을 사용하여 저장점 정의세이브포인트당신은 필요한 경우 다음을 사용하여 저장점으로 롤백할 수 있습니다.다음으로 롤백. 모든 트랜잭션의 데이터베이스 변경 사항 저장점을 정의하는 것과 저장점으로 롤백하는 것 사이에는 삭제되지만 저장점 이전의 변경 사항은 유지됩니다.

저장점으로 롤백한 후에도 계속 정의됩니다. 여러 번 롤백할 수 있습니다. 반대로 만약 당신이 특정 저장점으로 다시 롤백할 필요가 없습니다. 해제할 수 있으므로 시스템에서 일부 리소스를 확보할 수 있습니다. 유지 저장점을 해제하거나 롤백하면 이후에 정의된 모든 저장점을 자동으로 해제합니다. 그것.

이 모든 것은 거래 블록 내에서 발생하므로 다른 데이터베이스 세션에서도 볼 수 있습니다. 커밋하는 시기와 커밋하는 경우 트랜잭션 블록에서 커밋된 작업은 다음과 같이 표시됩니다. 롤백된 작업은 다른 세션으로 전환되지 않습니다. 전혀 보이지 않습니다.

은행 데이터베이스를 기억하면서 우리가 $100.00를 인출한다고 가정하겠습니다. Alice의 계정과 Bob의 계정에 크레딧을 제공하고 나중에 그 사실을 확인합니다. 우리는 Wally의 계좌에 입금했어야 했어요. 우리는 그것을 사용하여 그것을 할 수 있습니다 다음과 같은 저장점:

시작;
UPDATE 계정 SET 잔액 = 잔액 - 100.00
    WHERE 이름 = '앨리스';
SAVEPOINT my_savepoint;
UPDATE 계정 SET 잔액 = 잔액 + 100.00
    WHERE 이름 = '밥';
-- 이런... 그건 잊어버리고 Wally의 계정을 사용하세요
my_savepoint로 롤백;
UPDATE 계정 SET 잔액 = 잔액 + 100.00
    WHERE 이름 = '월리';
커밋;

이 예는 물론 지나치게 단순화되었지만 많은 내용이 있습니다. 을 사용하여 트랜잭션 블록에서 제어가 가능합니다. 저장점. 게다가다음으로 롤백이것은 투입된 거래 블록에 대한 통제권을 다시 얻을 수 있는 유일한 방법 오류로 인해 시스템에 의해 중단된 상태(롤링 부족) 완전히 돌아와서 다시 시작하세요.