거래는 기본 개념입니다 모든 데이터베이스 시스템 중. 거래의 필수 요점은입니다 그것은 하나의 단일 또는 전혀없는 단일에 여러 단계를 묶습니다 작업. 단계들 사이의 중간 상태는 아닙니다 다른 동시 거래에 보이고, 약간의 실패 거래가 완료되는 것을 방지하는 경우 단계는 데이터베이스에 전혀 영향을 미칩니다.
예를 들어, 잔액이 포함 된 은행 데이터베이스를 고려하십시오. 다양한 고객 계정 및 총 예금 잔고 가지. 우리가 $ 100.00의 지불을 기록하고 싶다고 가정합니다. 밥의 계정에 대한 앨리스의 계정. 엄청나게 단순화, SQL 이것에 대한 명령은 다음과 같습니다.
업데이트 계정 설정 밸런스 = 밸런스 -100.00 여기서 이름 = 'Alice'; 업데이트 브랜치 설정 밸런스 = 밸런스 -100.00 여기서 name = (name = 'Alice')가있는 계정에서 branch_name을 선택하십시오); 계정 업데이트 설정 밸런스 = 밸런스 + 100.00 여기서 이름 = 'bob'; 업데이트 브랜치 설정 밸런스 = 밸런스 + 100.00 여기서 name = (name = 'bob'); 계정에서 branch_name을 선택하십시오.
이 명령의 세부 사항은 여기서 중요하지 않습니다. 그만큼 중요한 점은 몇 가지 별도의 업데이트가 관련되어 있다는 것입니다. 이 간단한 작업을 수행합니다. 우리 은행의 장교 이 모든 업데이트가 발생하거나 그들 중 누구도 일어나지 않습니다. 그것은 확실히 시스템 고장에 대해서는하지 않을 것입니다 Bob은 Alice로부터 차감되지 않은 $ 100.00을받습니다. Alice Long은 그녀가 차감되면 행복한 고객으로 남아 있지 않을 것입니다. 밥이 인정받지 않고. 우리는 무언가를 보장해야합니다 작업을 통해 잘못된 부분, 아무 단계도 없습니다. 지금까지 실행 된 것이 적용됩니다. 업데이트를 A로 그룹화합니다거래우리 에게이 보증을 제공합니다. 에이 거래는Atomic:에서 다른 거래의 관점에서 완전히 발생합니다. 전혀 그렇지 않습니다.
일단 거래가 완료되면 데이터베이스 시스템에 의해 인정 된 것은 실제로 영구적으로 기록되며 충돌이 발생하더라도 손실되지 않습니다. 그 후 얼마 지나지 않아. 예를 들어, 우리가 현금을 기록하는 경우 Bob의 철수, 우리는 그의 차변이 그의 그가 은행을 나가 자마자 충돌로 계정이 사라질 것입니다. 문. 트랜잭션 데이터베이스는 모든 업데이트를 보장합니다 트랜잭션은 영구 저장소에 로그인됩니다 (즉, 디스크에서) 거래가 완료되기 전에.
트랜잭션 데이터베이스의 또 다른 중요한 속성이 밀접하게 있습니다 원자 업데이트 개념과 관련하여 : 여러 거래일 때 동시에 실행 중이며, 각각은 다른 사람들의 불완전한 변화. 예를 들어, 하나의 트랜잭션 인 경우 모든 지점 잔액을 총계로 바쁘게 바쁘다. Alice의 지점에서 차변을 포함 시키지만 신용은 밥의 지점도 그 반대도 마찬가지입니다. 따라서 거래는 있어야합니다 영구적 인 영향 측면에서뿐만 아니라 데이터베이스뿐만 아니라 가시성이 발생할 때도 마찬가지입니다. 그만큼 공개 거래에 의해 지금까지 이루어진 업데이트는 다른 사람에게는 보이지 않습니다. 트랜잭션이 완료 될 때까지 트랜잭션 업데이트가 동시에 보이게됩니다.
in배트맨 토토, 거래는입니다 트랜잭션의 SQL 명령을 둘러싼를 둘러싸고 설정시작및커밋명령. 그래서 우리의 은행 거래는 실제로 다음과 같습니다.
시작; 계정 업데이트 설정 밸런스 = 밸런스 -100.00 여기서 이름 = 'Alice'; 등. 등 저지르다;
거래를 통해 파트 웨이를 사용하는 경우, 우리는 우리가 원하지 않는다고 결정합니다. Commit (아마도 우리는 방금 앨리스의 균형이 갔다는 것을 알았을 것입니다 부정), 우리는 명령을 발행 할 수 있습니다롤백대신커밋, 그리고 지금까지 우리의 모든 업데이트가 취소 될 것입니다.
배트맨 토토실제로 취급합니다 거래 내에서 실행되는 모든 SQL 문. 당신이 발행하지 마십시오시작명령, 각각 개인 진술에는 암시 적시작및 (성공한 경우)커밋포장 그것. 둘러싸인 진술 그룹시작and커밋IS 때때로 a트랜잭션 블록.
참고 :일부 클라이언트 라이브러리 문제시작and커밋명령 거래의 영향을받을 수 있도록 자동으로 묻지 않고 블록. 인터페이스에 대한 설명서를 확인하십시오 당신은 사용 중입니다.
거래에서 진술서를 제어 할 수 있습니다. 사용을 통한 더 세분화 된 패션SavePoints. 저장 포인트를 사용하면 선택적으로 할 수 있습니다 나머지를 커밋하면서 거래의 일부를 폐기하십시오. 후에 로 SavePoint 정의SavePoint, 당신 필요한 경우와 함께 SavePoint로 롤백 할 수 있습니다.롤백으로. 모든 트랜잭션의 데이터베이스가 변경됩니다 SavePoint 정의와 그로 롤백하는 것 사이에 폐기되었지만 SavePoint보다 일찍 변경됩니다.
SavePoint로 롤백 한 후에도 계속 정의됩니다. 따라서 여러 번 롤백 할 수 있습니다. 반대로, 당신이 있다면 물론 특정 저장 포인트로 다시 롤백 할 필요는 없습니다. 해제 할 수 있으므로 시스템은 일부 리소스를 자유롭게 할 수 있습니다. 들어보세요 SavePoint로 다시 롤백하거나 롤백하면 이후에 정의 된 모든 저장 포인트를 자동으로 해제합니다 그것.
이 모든 일은 트랜잭션 블록 내에서 일어나고 있으므로 다른 데이터베이스 세션에 볼 수 있습니다. 언제, 당신이 커밋하는 경우 거래 블록, 커밋 된 조치는 롤백 액션은 절대되지 않지만 다른 세션에 유닛 전혀 눈에 띄는.
은행 데이터베이스를 기억하면서 우리가 $ 100.00을 차변한다고 가정합니다 Alice의 계정 및 Bob의 계정, 나중에 만 찾기 위해서만 Wally의 계정을 인정해야합니다. 우리는 그것을 사용할 수 있습니다 다음과 같은 SavePoints :
시작; 계정 업데이트 설정 밸런스 = 밸런스 -100.00 여기서 이름 = 'Alice'; SavePoint My_SavePoint; 계정 업데이트 설정 밸런스 = 밸런스 + 100.00 여기서 이름 = 'bob'; - 죄송합니다 ... 그것을 잊고 Wally의 계정을 사용하십시오 my_savepoint 로의 롤백; 계정 업데이트 설정 밸런스 = 밸런스 + 100.00 여기서 이름 = '월리'; 저지르다;
이 예제는 물론 지나치게 단순화되었지만 많은 것이 있습니다. 사용을 통해 거래 블록에서 가능한 제어 저장 포인트. 게다가,롤백으로is 배치 된 트랜잭션 블록의 제어를 회복하는 유일한 방법 오류로 인해 시스템에 의해 중단 된 상태, 롤링이 부족합니다. 완전히 다시 시작하고 다시 시작합니다.
이전 | 배트맨 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | 다음 |
외국 키 | up | 창 함수 |