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 | | | |