Transaction === ## ACID 트랜잭션은 ACID 를 보장 해야 한다. - 원자성 Atomicity -- 중간에 실패하면 모두 실패해야 한다. - 일관성 Consistency -- 언제나 일관성있는 데이터를 유지해야 한다. (무결성) - 격리성 Isolation -- 수행중인 트랜잭션은 격리되어, 다른 연산이 끼어들지 않아야 한다. - 지속성 Durability -- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다. > 간략히 정리했고, 상세한 설명은 ACID 의 [wiki](https://ko.wikipedia.org/wiki/ACID) 를 참고 하자. @Transactional 만 사용해도 ACID 를 보장받을수 있다. ## 격리(Isolation) 은 격리 수준을 조절 할수 있다. Isolation 을 완벽히 지키려면, 모든 트랜잭션은 직렬로 수행 되어야 하는데, 성능 감소의 문제가 있다. 때문에 Isolation은 유연하게 변경할 수 있도록 옵션으로 수준을 지정 할 수 있다. #### 격리 수준 1. Read uncommited (커밋되지 않은 읽기) 2. Read commited (커밋된 읽기) 3. Repeatable read (반복 가능한 읽기) 4. Serializable (직렬화 가능) > 밑으로 갈 수록 격리수준이 높고 성능이 낮다. 4번의 경우, 1번 트랜잭션이 끝나야 2번을 수행 하게 됨으로써 완벽하게 격리되지만 그만큼 느릴수 밖에 없다. 따라서 문제가 발생하지 않는 선에서 격리수준을 낮게 설정하는것이 성능에 도움이 된다. ### 격리 수준이 낮으면 어떤 문제가 발생 할까? 발생하는 문제는 3가지가 있다. 1. Dirty Read 2. Non-Repeatable Read 3. Phantom Read 격리수준이 낮을수록 문제들이 많이 발생하게 되는데, 격리 수준별 발생하는 문제들은 다음 표를 참고 하자. |격리수준|Dirty Read|Non-Repeatable Read|Phantom Read| |:---:|:---:|:---:|:---:| | 1 | O | O | O | | 2 | | O | O | | 3 | | | O | | 4 | | | |