2017年4月15日土曜日

REPEATABLE READ란 무엇인가?

Transaction 분리 레벨에 REPEATABLE READ라고 있습니다.
REPEATABLE READ은, 같은 Transaction안에서는 반듯이 같은 값을 가지고 온다는 설정입니다.
MySQL은 REPEATABLE READ을 Default로 하고 있습니다.
REPEATABLE READ가 어떻게 동작하는지 알아보도록 하겠습니다.


왼쪽을 트랜잭션 t1이라고 하겠습니다.

오른쪽을 트랜잭션 t2라고 하겠습니다.
t1과 t2에 서로 begin을 하겠습니다. 그리고 t1에서 insert하고 commit를 하고, t2에서 확인을 해보겠습니다. 샐행 시간을 잘봐 주세요.
t2에서 begin을 하고 select " from test;를 해도 t1에서 입력한 값이 보이질 않습니다.t2 begin을 commit하고 나서 select를 하면 t1에서 입력한 값이 보입니다.
update도 같은 트랜젝션에서는 같은 값이 보입니다.
일괄성읽기 전용이라고 할수 있습니다. 이것을 REPEATABLE READ라고 하는 것입니다.

PostgreSQL가 Oracle은 READ COMMITTED을 사용하고 있어서 서로다른 트랜젝션에서 commit를 하게 되면 다른 트랜젝션에서도 참조가 됩니다.
왜, MySQL은 REPEATABLE READ을 Default로 사용하는지 그렇다면 어디서 이것을 쓰는지 알수 있을 까요?
저도 왜?MySQL이 REPEATABLE READ을 Default로 사용하는지는 모름니다만, 어디에 사용해야하는지는 알고 있어 설명을 드리도록 하겠습니다.
예) 트랜젝션(t1)에서는 시간 테이블에 1초에 하나씩 테이터를 Insert합니다.
     시간 테이블을 보고 8시 정각에 실행되는 스케줄이 5개 있다고 합시다.
     트랜젝션(t2)에서는 1건씩 보면서 처리는 하는데 처리시간이 1초 건린다고 하면
     이 처리는 1건만 끝나고, 다음 처리는 1초가 지났으므로 처리가 안될 것입니다.
    이럴때, 사용하는 것이 REPEATABLE READ입니다.
    t2에서 commit만 하지 않는다면 5건이 끝날때까지 t2에서 읽는 시간은 8시이기 때문에 전부 처리가 가능합니다.

어떤 시스템을 만들때 사양을 잘 이해하고, 트랜젝션에 대해서도 이해를 하고 있다면 정말로 훌륭한 시스템을 만들수 있다고 생각합니다. 아키텍쳐, 모델러 등은 반듯이 각 시스템의 특성을 알고 설계를 하시면 좋겠습니다.

이상입니다.

0 件のコメント: