문제
나는 단지 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에서 커밋되지 않은 데이터를 읽을 수는 없습니다. (여기서 잠금은 기본적으로 어딘가에 메모입니다. " 나는 여기서 일하고있다. 만지지 마라. ")
다른 팁
제휴하지 않습니다 StackOverflow