3.4. 업무

거래는 모든 윈 토토터베이스 시스템의 기본 개념입니다. 트랜잭션의 필수 요점은 여러 단계를 단일 또는 전혀없는 작업으로 묶는다는 것입니다. 단계들 사이의 중간 상태는 다른 동시 트랜잭션으로 보이지 않으며, 트랜잭션이 완료되는 것을 방지하는 일부 실패가 발생하면 단계가 윈 토토터베이스에 전혀 영향을 미치지 않습니다..

예를 들어, 다양한 고객 계정에 대한 잔액이 포함 된 은행 윈 토토터베이스와 지점의 총 예금 잔액을 고려하십시오. Alice의 계정에서 Bob의 계정으로 $ 100.00의 지불을 기록하고 싶다고 가정하십시오. 엄청나게 단순화하면, 이에 대한 SQL 명령은 다음과 같습니다.

업윈 토토트 계정 설정 밸런스 = 밸런스 -100.00
    여기서 이름 = 'Alice';
업윈 토토트 브랜치 설정 밸런스 = 밸런스 -100.00
    여기서 name = (name = 'Alice')가있는 계정에서 branch_name을 선택하십시오);
계정 업윈 토토트 설정 밸런스 = 밸런스 + 100.00
    여기서 이름 = 'bob';
업윈 토토트 브랜치 설정 밸런스 = 밸런스 + 100.00
    여기서 name = (name = 'bob'); 계정에서 branch_name을 선택하십시오.

이 명령의 세부 사항은 여기서 중요하지 않습니다. 중요한 점은이 간단한 작업을 수행하기위한 몇 가지 별도의 업윈 토토트가 있다는 것입니다. 우리 은행의 경찰관은 이러한 모든 업윈 토토트가 발생하거나 그 중 어느 것도 발생하지 않는다는 확신을 갖기를 원할 것입니다. 밥이 앨리스로부터 차감하지 않은 $ 100.00을받지 못하게하는 시스템 실패는 확실히하지 않을 것입니다. 밥이 밥을 인정받지 않고 차감된다면 앨리스 롱은 행복한 고객으로 남아 있지 않을 것입니다. 작업을 통해 무언가 잘못되면 지금까지 실행 된 단계 중 어느 것도 적용되지 않을 것이라는 보장이 필요합니다. 업윈 토토트를 A로 그룹화합니다거래우리 에게이 보증을 제공합니다. 거래는Atomic: 다른 거래의 관점에서 볼 때, 그것은 완전히 발생하거나 전혀 발생하지 않습니다.

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

트랜잭션 데이터베이스의 또 다른 중요한 속성은 원자 업데이트의 개념과 밀접한 관련이 있습니다. 여러 트랜잭션이 동시에 실행될 때 각각은 다른 사람이 불완전한 변경 사항을 볼 수 없어야합니다. 예를 들어, 하나의 트랜잭션이 모든 지점 잔액을 총계로 바쁘게하는 경우 Alice의 지점에서 차변을 포함시키지 않지만 Bob의 지점에 대한 크레딧은 포함되지 않으며 그 반대도 마찬가지입니다. 따라서 거래는 데이터베이스에 대한 영구적 인 영향뿐만 아니라 가시성이 발생하는 경우에도 전혀 또는 전혀 없어야합니다. 공개 트랜잭션으로 지금까지 이루어진 업데이트는 거래가 완료 될 때까지 다른 거래에 보이지 않으며, 모든 업데이트가 동시에 보이게됩니다.

inPostgreSQL, 트랜잭션의 SQL 명령을 둘러싼 트랜잭션은시작커밋명령. 그래서 우리의 은행 거래는 실제로 다음과 같습니다.

시작;
계정 업데이트 설정 밸런스 = 밸런스 -100.00
    여기서 이름 = 'Alice';
등. 등
저지르다;

거래를 통해 파트 웨이를 통해 우리는 커밋하고 싶지 않다고 결정했다 (아마도 우리는 앨리스의 잔액이 부정적인 것으로 나타 났을 것입니다).롤백대신커밋, 지금까지 모든 업윈 토토트가 취소됩니다.

PostgreSQL실제로 모든 SQL 문을 거래 내에서 실행되는 것으로 취급합니다. 당신이 a를 발행하지 않으면시작명령, 그러면 각 개별 진술은 암시 적입니다시작및 (성공한 경우)커밋그 주위에 싸여 있습니다. 둘러싸인 진술 그룹시작and커밋가끔 a라고합니다.거래 블록.

Note

일부 클라이언트 라이브러리 문제시작and커밋묻지 않고 트랜잭션 블록의 효과를 얻을 수 있도록 자동으로 명령을 내립니다. 사용중인 인터페이스에 대한 설명서를 확인하십시오.

|SavePoints. 저장 포인트를 사용하면 나머지를 커밋하면서 거래의 일부를 선택적으로 폐기 할 수 있습니다. 로 SavePoint를 정의한 후SavePoint, 필요한 경우 SavePoint로 다시 롤백하여롤백으로. SavePoint 정의와 롤백으로 롤백 간의 모든 트랜잭션의 데이터베이스 변경 사항은 폐기되지만 SavePoint보다 일찍 변경됩니다.

SavePoint로 롤백 한 후에도 계속 정의되므로 여러 번 롤백 할 수 있습니다. 반대로, 특정 SavePoint로 다시 롤백 할 필요가 없다고 확신하면 해제 될 수 있으므로 시스템은 일부 리소스를 확보 할 수 있습니다. SavePoint로 릴리스 또는 롤백하면 그 뒤에 정의 된 모든 저장 포인트가 자동으로 해제됩니다.

이 모든 것은 트랜잭션 블록 내에서 발생하므로 다른 데이터베이스 세션에는 보이지 않습니다. 트랜잭션 블록을 커밋하는 경우, 헌신적 인 조치는 다른 세션의 단위로 보이게되며, 롤백 동작은 전혀 보이지 않습니다.

은행 데이터베이스를 기억하면서, 우리가 Alice의 계정에서 $ 100.00를 차지하고 Bob의 계정을 인정한다고 가정 해보십시오. 우리는 다음과 같은 SavePoints를 사용하여 할 수 있습니다.

시작;
계정 업데이트 설정 밸런스 = 밸런스 -100.00
    여기서 이름 = 'Alice';
SavePoint My_SavePoint;
계정 업데이트 설정 밸런스 = 밸런스 + 100.00
    여기서 이름 = 'bob';
- 죄송합니다 ... 그것을 잊고 Wally의 계정을 사용하십시오
my_savepoint 로의 롤백;
계정 업데이트 설정 밸런스 = 밸런스 + 100.00
    여기서 이름 = '월리';
저지르다;

이 예제는 물론 지나치게 단순화되었지만 SavePoints를 사용하여 트랜잭션 블록에 많은 제어가 가능합니다. 게다가,롤백으로| 오류로 인해 시스템에 의해 중단 된 트랜잭션 블록의 제어를 회복하는 유일한 방법입니다.

수정 제출

문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면