https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

Dirty Read
다른 트랜젝션에 의해 수정되었지만, 아직 커밋되지 않은 데이터를 읽는 현상.
변경 후 아직 커밋되지 않은 값을 읽었고 변경을 가한 트랜젝션이 최종적으로 롤백 되었다면, 그 읽은 값은 트랜젝션은 정합성이 깨짐
Non-Repeatable Read
한 트랜젝션 내에서 동일한 쿼리를 수행했는데, 그 사이 다른 트랜젝션에서 값을 수정하는 바람에 두 쿼리의 결과가 다르게 나타나는 현상.
트랜젝션A 에서 특정 행을 읽었고 그 후에 트랜젝션B 에서 동일한 행을 갱신함. 그리고 트랜젝션A 가 다시 동일한 행을 읽었을때 그 두 결과가 다름
Phantom Read
한 트랜젝션 내에서 동일한 쿼리를 수행했는데, 첫번째 쿼리결과에서 없던 행이 두번째 쿼리실행 결과에서 생긴 현상
트랜젝션A가 쿼리를 수행하고 난뒤, 트랜젝션B 에서 새로운 행을 추가하거나 업데이트하고 난뒤, 다시 트랜젝션A가 쿼리를 수행하였을때, 트랜잭션B에서 추가하거나 변경한 내용이 보임 (마치 없던 결과가 생깄다고 하여 Phantom Read)
격리 수준
- Read Uncommitted
트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다
- Read Committed
트랜잭션이 커밋되어 확정된 데이터만 다른 트랜잭션이 읽도록 허용함으로써 Dirty Read를 방지해준다. 커밋된 데이터만 읽더라도 Non-Repeatable Read와 Phantom Read 현상을 막지는 못한다. 읽는 시점에 따라 결과가 다를 수 있다는 것이다. 한 트랜잭션 내에서 쿼리를 두 번 수행했는데 두 쿼리 사이에 다른 트랜잭션이 값을 변경/삭제하거나 새로운 레코드를 삽입하는 경우에 그러한 현상이 발생한다.
- Repeatable Read
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌는 현상을 방지해 준다. 이 트랜잭션 격리성 수준이 Phantom Read 현상을 막지는 못한다. 첫 번째 쿼리에서 없던 새로운 레코드가 나타날 수 있다는 것이다. 한 트랜잭션 내에서 쿼리를 두 번 수행했는데 두 쿼리 사이에 다른 트랜잭션이 새로운 레코드를 삽입하는 경우에 그런 현상이 발생할수 있다.
- Serializable Read
트랜잭션 내에서 쿼리를 두 번 이상 수행할 때, 첫 번째 쿼리에 있던 레코드가 사라지거나 값이 바뀌지 않음은 물론 새로운 레코드가 나타나지도 않는다.