트랜잭션 isolation 속성의 의미
트랜잭션의 속성 중에는 isolation 속성이 있다
우리말로 격리라는 뜻을 가진 isolation의 의미는
여러 트랜잭션이 동시에 실행해도 각각의 트랜잭션이 서로 다른 트랜잭션에게 영향을 받지 않고
격리돼서 실행되는 것처럼 동작해야 함을 의미한다
Lost update 현상이란?
isolation 속성이 없으면 여러 트랜잭션들이 동시에 실행될 때 예상했던 결과와는 다른 결과가 생긴다
예를 들어보겠다
X의 계좌에는 50이 있고
Y의 계좌에는 10이 있다
만약 X에서 Y에게 40을 이체하는 트랜잭션 1과
X에게 30을 입금하는 트랜잭션 2가 동시에 실행됐다고 가정해 보자
그러면 시간 타이밍에 따라 여러 결과가 나올 수 있는데, 아래는 그중에 한 가지 예다
트랜잭션1 | 트랜잭션2 |
start transaction | |
start transaction | |
read(X) => 50 | |
read(X) => 50 | |
write(X = 80) | |
write(X = 10) | |
commit | |
read(Y) = 10 | |
write(Y = 50) | |
commit |
두 개의 트랜잭션이 모두 종료됐을 때
정상적으로 동작했다면 X와 Y의 최종 값은
X = 40, Y = 50
이 됐을 것이다
하지만 위 결과는
X = 10, Y = 50
이 됐다
트랜잭션 2가 수행한, X에 30을 더한 결과가 사라진 것이다
이 현상이 바로 lost update 이다
lost update 발생 이유
트랜잭션 1과 트랜잭션 2는 모두 X를 업데이트하기 때문에
제대로 계산이 되려면 두 개 중에 하나는
상대 트랜잭션이 업데이트한 X 값을 읽어야 하는데
둘 다 상대 트랜잭션이 write(X)를 하기 전에 read(X)를 했기 때문이다
이렇게, 업데이트한 내용이 사라지는 현상을
lost update 라고 부른다
여러 트랜잭션이 동시에 실행되면 lost update 외에도 다양한 종류의 이상 현상들이 발생할 수 있다
그리고 이런 이상 현상들이 생기지 않아야 한다는 게 트랜잭션의 isolation 속성이 의미하는 바다
하지만 이 isolation 속성은 트랜잭션의 ACID 속성들 중에 가장 많이 타협되는 속성이기도 하다
DBMS의 성능과 연관이 있기 때문이다
isolation의 엄격함과 DBMS의 트랜잭션 처리량과 사이에서 개발자가 트레이드할 수 있도록
isolation level을 제공하는 이유도 이것 때문이다
쉬운코드는 본질에 충실합니다
👉 " 트랜잭션 ACID 속성 간단히 정리 " 글 보러 가기
👉 " isolation level과 다양한 이상 현상 " 영상 보러 가기