Transaction isolation levels are a measure of the extent to which transaction isolation succeeds. In particular, transaction isolation levels are defined by the presence or absence of the following phenomena:
출처 : Microsoft에서 알려주는 트랜잭션 격리 수준
트랜잭션이란 데이터베이스의 상태를 변경시키기 위해 여러 쿼리문을 묶은 하나의 작업 단위를 말합니다. START TRANSACTION
과 COMMIT
사이의 쿼리문들을 수행하다가 오류가 발생하면 전부 ROLL BACK되어 데이터베이스의 상태가 변경되지 않습니다! Mysql 예시
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
그런데 트랜잭션을 왜 사용해야 할까요?
간단하게 생각하면 요청은 여기저기서 동시다발적으로 오는데 데이터베이스는 하나이기 때문입니다. 그래서 트랜잭션은 아래의 3가지 현상들이 발생할 수 있는데 이를 기준으로 트랜잭션 격리 수준을 말하게 됩니다.
번역하면 더티 읽기.. 커밋되지 않은 데이터를 읽어 오는 것을 말합니다.
트랜잭션이 두 개가 동시에 발생할 때, 한 트랜잭션이 아직 커밋하지 않고 상태를 변경한 시점에 다른 트랜잭션이 그 상태를 읽고 있는데 그 상태가 롤백되어 버리는 상황입니다. 결국 존재하지 않게 되는 상태를 보는 일이 발생합니다.
같은 행을 다시 읽었는데 데이터가 달라지는 것을 말합니다. 처음에 데이터를 읽고 다시 요청한 사이에 다른 트랜잭션에 의해 데이터가 변경되거나 삭제되어서 이런 상황이 발생합니다.
없었는데요.. 있었습니다와 같은 상황입니다.
처음에 조회할 때는 데이터가 없었는데 다시 조회할 때 다른 트랜잭션에 의해 조건에 맞는 데이터가 생성되거나 수정되어서 데이터를 볼 수 있는 상황입니다.
4개의 transaction isolation levels (as defined by SQL-92)은 어떤 현상(위의 3가지 현상)이 일어나는 지에 따라 정의됩니다. 결국 트랜잭션 격리 수준은 각 트랜잭션 간 서로 변경하려고 하는 데이터에 대한 접근을 어느 수준까지 격리할 건지를 나타냅니다. 아래의 표에서는 "O"는 일어나는 현상이고, "X"는 일어나지 않는 현상입니다.
Transaction isolation level | Dirty reads | Nonrepeatable reads | Phantoms |
---|---|---|---|
Read uncommitted(트랜잭션 격리 X) | O | O | O |
Read committed(쓰기잠금이 없는 행만 읽고, 읽기잠금 권한은 해당 행을 읽을 때만 잠깐 보유) | X | O | O |
Repeatable read(쓰기잠금이 없는 행만 읽고, 트랜잭션이 끝날때까지 다른 트랜잭션의 읽기잠금 권한을 가짐) | X | X | O |
Serializable(트랜잭션의 직렬화) | X | X | X |
참고한 사이트
SAP에서 알려주는 SQL 트랜잭션 격리 수준