개발/고민과 생각

select 에도 transaction 걸어야 하는 이유

hojak99 2020. 12. 18. 00:20

예전에 막 개발을 시작했을 때 spring 에서 @Tramsactional 이라는 어노테이션을 단순 select 에서도 적용하는 것을 보고 궁금했었다. 이번에 Real Mysql 책을 보다가 비슷한? 내용이 나왔다.

트랜잭션 내에서 실행되는 SELECT 문장과 트랜잭션 없이 실행되는 SELECT 문장의 차이는 READ COMMITTED 격리 수준에서는 차이가 별로 없다.

그러나 REPEATABLE READ 격리 수준에서는 트랜잭션 동안에 다른 트랜잭션에서 아무리 특정 데이터를 변경하고 커밋하더라도 동일한 결과를 보게 된다. 그렇기 때문에 격리 수준에 따라서 동작이 달라진다. 위의 현상을 non-repeatable read 라고 한다. read committed 일 때는 특정 트랜잭션 내에서 A 데이터를 조회하고 나서 다른 트랜잭션에서 해당 데이터를 변경해버리고 A 트랜잭션에서 다시 해당 데이터를 조회하게 되면 변경된 데이터가 조회된다. 그래서 하나의 트랜잭션 내에서 똑같은 SELECT 쿼리를 날려고 항상 같은 결과를 보장하지 못해 정합성이 어긋날 수 있다.

 

반응형