2009-03-28 2 views
4

RDBMS에 대해 방금 읽었으며 및 RDBMS의 속성 중 하나가 원자력입니다. 따라서 계좌에서 돈이 인출되어 으로 이체 된 경우 거래 이 완전히 발생하거나 이 전혀 발생하지 않습니다. 부분 거래는 입니다. 그러나 실제로는 이 어떻게 보장됩니까? 상기 시나리오 위한Atomicity 보장 SQL

는 SQL 쿼리 (I)과 같이 accounts 세트 잔액 = 밸런스를 업데이트 할 수 - ac_num = 101 (II) 업데이트 량 accounts 세트 잔액 = 밸런스 + 양 WHERE ac_num = 102

어떤 의미로 원 자성을 보장하지 못합니까? 그래서 실제로 어떻게됩니까?

답변

4

당신은

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) (A 여기 잠그는 것은 기본적으로 어딘가에있는 메모입니다. "나는 여기서 일하고 만지지 마십시오.")

(210)
+0

아니요, 데이터베이스를 잠그지 않습니다. 트랜잭션 격리 모드에 따라 일반적으로 데이터베이스를 읽는 다른 사용자는 커밋되기 전에 업데이트를 볼 수 없습니다 (이전 값이 표시됨). – MarkR

+0

예, 트랜잭션 격리 모드에 따라 다릅니다. 최신 RDBMS에서 : s 잠금은 행 수준에서 발생합니다. 이 "이전 값"은 반복적 인 읽기 편차를 유발할 수 있습니다. –

1

원자하기 위해, 트랜잭션을 수행해야합니다

  • 방지 다른 트랜잭션들이 작성하거나 중 전부 또는 트랜잭션이 만들어내는 변화의 없음이 될 것입니다 있는지 확인
  • 을 읽고있는 행을 방해 트랜잭션이 커밋 될 때 데이터베이스에서.

첫 번째 트랜잭션은 실행 중에 트랜잭션이 읽거나 쓰는 행인 locking 행에 의해 수행됩니다.

둘째 트랜잭션이 수행되어 트랜잭션이 transaction log에 기록됩니다. 이렇게하면 트랜잭션 중에 서버의 전원이 꺼지더라도 데이터베이스를 복구 할 수 있습니다. 이 경우 복구 프로세스에서 로그를 읽고 활성 (커밋되지 않은) 트랜잭션이 중단되고 해당 트랜잭션의 변경 사항이 취소되는지 확인하십시오.