문제

나는 단지 RDBM에 대해 읽고 있었고, RDBMS의 한 가지 속성은 원자력입니다. 따라서 돈이 계정에서 철수되어 다른 계좌로 이체 된 경우 거래는 완전히 발생하거나 전혀 발생하지 않습니다. 부분 거래는 없습니다. 그러나 실제로 어떻게 보장 되는가?

위의 시나리오의 SQL 쿼리는 (i) 업데이트처럼 보일 수 있습니다. accounts Set Balance = 밸런스 - AC_NUM = 101 (ii) 업데이트 accounts Set Balance = Balance + AC_NUM = 102

어느 쪽이 원자력을 보장하지는 않습니다. 그렇다면 실제로 어떻게 발생합니까?

도움이 되었습니까?

해결책

당신이한다면

BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION

데이터베이스 시스템은 계정 101의 변경 사항에 대한 메모를 작성합니다. 그런 다음 계정 102 작업이 실패하면 RDBMS는 해당 메모를 사용하여 101의 작업을 취소합니다.

또한 계정에서 작업을 시작했을 때 101은 데이터베이스를 잠그고, 다른 사람은 업데이트 된 데이터를 읽을 수 없지만 계정 101에서 커밋되지 않은 데이터를 읽을 수는 없습니다. (여기서 잠금은 기본적으로 어딘가에 메모입니다. " 나는 여기서 일하고있다. 만지지 마라. ")

다른 팁

원자가 되려면 거래가 필요합니다.

  • 다른 거래가 쓰고있는 행을 방해하는 것을 방지합니다.
  • 트랜잭션이 저지르는 경우 거래가 발생하는 변경 사항이 데이터베이스에 있거나 전혀 없도록하십시오.

첫 번째는 달성됩니다 잠금 트랜잭션이 실행 중에 읽거나 쓰는 행입니다.

두 번째는 거래가 수행되어 거래가 자신의 행동을 트랜잭션 로그. 이로 인해 트랜잭션 중에 서버가 전원을 잃을 때에도 데이터베이스가 복구 할 수 있습니다. 이 경우 복구 프로세스는 로그를 읽고 활성 (누수되지 않은) 트랜잭션이 중단되고 변경 사항이 취소되어 있는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top