더북(TheBook)

이 두 구문을 실행하기 전에 begin transaction 구문을 먼저 실행하면 됩니다. 이를 트랜잭션의 시작이라고 합니다. 그리고 두 구문을 실행한 후 커밋(commit)을 실행합니다.

begin transaction
update UserAccount set Money=Money+100 where ID='Kang Bu Ja'
update UserAccount set Money=Money-100 where ID='Hong Gil Dong'
commit

이렇게 하면 두 update 구문의 실행 결과는 데이터베이스에 영구적으로 남습니다.

구문들을 실행하다가 뭔가 잘못된 것 같다고 판단되면(예를 들어 두 번째 구문을 실행하고 났더니 Money 값이 음수가 되었다면) commit 대신 rollback transaction을 실행하십시오. 그러면 begin transaction 구문을 실행한 후 변경한 데이터들이 모조리 원상 복구될 것입니다.

여기서 다음 궁금증이 생길 것입니다.

게임 서버 1·2가 있습니다. 이들 게임 서버는 데이터베이스에 액세스합니다. 게임 서버 1에서 begin transaction 구문으로 트랜잭션을 시작하고 두 update 구문을 실행합니다. 그리고 게임 서버 2에서 다음과 같이 게임 서버 1이 액세스한 레코드를 읽습니다.

select Money from UserAccount where ID = 'Kang Bu Ja'

게임 서버 2에서 Kang Bu Ja의 Money 값을 읽어 왔다고 칩시다. 그런데 게임 서버 1에서 rollback 구문을 실행해 버리면 어떻게 될까요? 게임 서버 2가 읽어 온 Kang Bu Ja의 Money 값은 되돌려야 하는데 이것이 생각보다 쉽지 않습니다. 어떤 일이 생길지 궁금하지 않나요?

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.