트랜잭션에서 동시성이란 여러 사용자들이 하나의 데이터베이스에 접근했을 때 적절한 통제 조치가 있어야 한다는 것을 말합니다. 따라서, 동시성 이슈는 하나 이상의 트랜잭션이 동시에 동일한 데이터에 접근하여 읽기/쓰기 오퍼레이션을 할 때 발생 할 수 있습니다.
이러한 동시성 이슈 즉, 트랜잭션들 간에 동일한 데이터에 대한 동시 접근을 제한하기 위하여 Lock을 설정하여 관리합니다. Lock 은 Thread 에서 공유 자원에 동시 접근을 제한하기 위해 Lock을 거는 것과 비슷합니다. 트랜잭션에 Lock을 걸수록 그만큼 동시성은 낮아지고 응답성이 낮아집니다. 따라서 상황별로 꼭 필요한 수준의 Lock을 걸어서 트랜잭션의 원자성을 유지하고 최대한 성능을 낼 수 있도록 하기 위해 격리레벨(Isolation level)이 등장하게 됩니다.
하지만, 그럼에도 불구하고 각각의 격리 레벨에 따른 동시성 이슈가 존재합니다.
ex)트랜잭션1에서 A테이블을 SELECT 한 후 트랜잭션2에서 A테이블 내용을 변경(UPDATE)하는 상황
트랜잭션2가 해당 변경사항을 commit 하지도 않았는데, 트랜잭션1에서 다시 A테이블을 SELECT하면 해당 변경사항을 읽어들일 수 있게 됩니다
ex)트랜잭션1에서 A테이블을 SELECT 한 후 트랜잭션2에서 A테이블 내용을 변경(UPDATE)하는 상황 가정
트랜잭션2가 해당 변경사항(UPDATE)을 commit 한 이후에, 트랜잭션1에서 다시 A테이블을 SELECT하면 해당 변경사항을 읽어들일 수 있게 됩니다
ex)트랜잭션1이 A테이블에서 SELECT한 이후 트랜잭션2에서 A테이블에 내용을 추가/삭제(INSERT/UPDATE)하는 상황 가정
Repeatable Read가 보장된 경우, A테이블에서 SELECT해왔던 데이터들을 다른 트랜잭션2가 수정(UPDATE)하여 commit한 후 트랜잭션1에서 다시 A테이블을 SELECT 하더라도 트랜잭션2의 수정내용을 읽어들일 수 없습니다. 하지만 트랜잭션2가 추가/삭제(INSERT/DELETE)를 한 경우, 다시 A 테이블에서 SELECT하게 되면 기존에 A에서 SELECT했던 데이터에서 row가 추가되거나 사라질 수 있습니다.(유령 데이터)