거래는 모든 데이터베이스 시스템의 기본 개념입니다. 젠 토토의 필수 요점은 여러 단계를 단일 또는 전혀없는 작업으로 묶는다는 것입니다. 단계들 사이의 중간 상태는 다른 동시 젠 토토으로 보이지 않으며, 젠 토토이 완료되는 것을 방지하는 일부 실패가 발생하면 단계가 데이터베이스에 전혀 영향을 미치지 않습니다..
예를 들어, 다양한 고객 계정에 대한 잔액이 포함 된 은행 데이터베이스와 지점의 총 예금 잔액을 고려하십시오. 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이 현금 인출을 기록하는 경우, 우리는 그의 계좌에 대한 차변이 은행 문 밖으로 나간 직후 사고로 사라질 가능성이 없습니다. A transactional database guarantees that all the updates made by a transaction are logged in permanent storage (i.e., on disk) before the transaction is reported complete.
트랜잭션 데이터베이스의 또 다른 중요한 속성은 원자 업데이트의 개념과 밀접한 관련이 있습니다. 여러 트랜잭션이 동시에 실행될 때 각각은 다른 사람이 불완전한 변경 사항을 볼 수 없어야합니다. 예를 들어, 하나의 트랜잭션이 모든 지점 잔액을 총계로 바쁘게하는 경우 Alice의 지점에서 차변을 포함시키지 않지만 Bob의 지점에 대한 크레딧은 포함되지 않으며 그 반대도 마찬가지입니다. 따라서 거래는 데이터베이스에 대한 영구적 인 영향뿐만 아니라 가시성이 발생하는 경우에도 전혀 또는 전혀 없어야합니다. 공개 트랜잭션으로 지금까지 이루어진 업데이트는 거래가 완료 될 때까지 다른 거래에 보이지 않으며, 모든 업데이트가 동시에 보이게됩니다.
inPostgreSQL, 젠 토토의 SQL 명령을 둘러싼 젠 토토은시작and커밋명령. 그래서 우리의 은행 거래는 실제로 다음과 같습니다.
시작; 계정 업데이트 설정 밸런스 = 밸런스 -100.00 여기서 이름 = 'Alice'; 등. 등 저지르다;
거래를 통해 파트 웨이를 통해 커밋하고 싶지 않다고 결정하면 (아마도 우리는 아마도 Alice의 잔액이 부정적인 것으로 나타 났을 것입니다), 우리는 명령을 발행 할 수 있습니다.롤백대신커밋, 지금까지 모든 업데이트가 취소됩니다.
PostgreSQL실제로 모든 SQL 문을 거래 내에서 실행되는 것으로 취급합니다. 당신이 a를 발행하지 않으면시작명령, 그러면 각 개별 진술은 암시 적입니다시작및 (성공한 경우)커밋그 주위에 싸여 있습니다. 둘러싸인 진술 그룹시작and커밋가끔 a라고합니다.거래 블록.
참고 :일부 클라이언트 라이브러리 문제시작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를 사용하여 트랜잭션 블록에 많은 제어가 가능합니다. 게다가,롤백으로오류로 인해 시스템에 의해 중단 된 젠 토토 블록의 제어를 회복하는 유일한 방법입니다.