
트랜잭션의 격리 수준(Transaction Isolation Level)
여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경을 하거나 조회를 하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이.
Read UnCommitted
커밋 되지 않은 데이터조차 접근할 수 있는 격리 수준이다.
다른 트랜잭션의 작업이 커밋되거나 롤백되지 않았어도 즉시 보인다.
예를 들어, A 사용자가 트랜잭션에서 INSERT를 통해 데이터를 추가했다고 가정한다.
이때 커밋이나 롤백 여부가 결정되지 않았더라도 READ UNCOMMITTED에서는 이 데이터에 접근할 수 있다. 이는 가장 낮은 격리 수준을 가지며 높은 동시성을 제공한다.
많은 성능이 요구되고 데이터 무결성 문제가 크게 우려되지 않는 경우에 사용할 수 있다. 그러나 실제로는 거의 사용되지 않는다.
READ UNCOMMITTED: A 사용자가 트랜잭션에서 데이터를 추가하는 동안(연산 중, 커밋 및 롤백 여부 미정), B 사용자가 이 데이터를 읽을 수 있다.
Read Committed
READ COMMITTED는 커밋된 데이터만 조회할 수 있는 격리 수준이다.
다른 트랜잭션이 커밋되지 않은 데이터는 볼 수 없다.
예를 들어, 동일한 트랜잭션 내에서 입금을 여러 번 할 경우, 조회할 때마다 입금된 내역이 달라질 수 있다. 이는 "논리적 불일치(Non-repeatable Read)"가 발생할 수 있음을 의미한다.
대부분의 일반적인 OLTP(Online Transaction Processing) 시스템에서 사용된다.
READ COMMITTED: A 사용자가 데이터를 추가하고 커밋하기 전까지, B 사용자는 이 데이터를 읽을 수 없다.
Repeatable Read
REPEATABLE READ는 트랜잭션이 시작된 시점 이후 다른 트랜잭션이 수정한 데이터를 읽을 수 없게 한다. 트랜잭션이 여러 번 동일한 데이터를 읽을 때 항상 같은 결과를 반환한다.
그러나 새로운 레코드의 추가는 막지 않기 때문에 "팬텀 리드(Phantom Read)"가 발생할 수 있다.
예를 들어, SELECT로 조회한 경우 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견될 수 있다.
이는 MVCC(Multi-Version Concurrency Control) 덕분에 일반적인 조회에서는 발생하지 않는다. 왜냐하면 자신보다 나중에 실행된 트랜잭션이 추가한 레코드는 무시하면 되기 때문이다.
REPEATABLE READ: A 사용자가 트랜잭션을 시작한 후 데이터를 읽으면, B 사용자가 데이터를 수정하더라도 A 사용자는 동일한 데이터를 계속해서 읽을 수 있다.
Serializable
SERIALIZABLE은 가장 높은 수준의 격리 수준으로, 모든 트랜잭션을 순차적으로 실행하는 것처럼 보이게 한다. 이는 완전한 격리를 보장하며, 가장 낮은 동시성을 가진다. 데이터 일관성이 절대적으로 중요한 경우, 예를 들어 금융 거래 시스템에서 사용된다.
SERIALIZABLE: A와 B 사용자가 각각 트랜잭션을 시작할 때, 한 사용자가 트랜잭션을 완료하기 전까지 다른 사용자는 트랜잭션을 진행할 수 없다.
'mysql' 카테고리의 다른 글
# 서브쿼리 이해해보기 (0) | 2024.08.06 |
---|---|
동시성문제의 필요성 (0) | 2024.07.19 |
트랜잭션 정리글 및 이해하기 [1편] (0) | 2024.07.15 |
jdbc PreparedStatement (0) | 2023.08.01 |
tool을 이용하여 E-R다이어그램 설계방법 (0) | 2023.07.25 |

트랜잭션의 격리 수준(Transaction Isolation Level)
여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경을 하거나 조회를 하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이.
Read UnCommitted
커밋 되지 않은 데이터조차 접근할 수 있는 격리 수준이다.
다른 트랜잭션의 작업이 커밋되거나 롤백되지 않았어도 즉시 보인다.
예를 들어, A 사용자가 트랜잭션에서 INSERT를 통해 데이터를 추가했다고 가정한다.
이때 커밋이나 롤백 여부가 결정되지 않았더라도 READ UNCOMMITTED에서는 이 데이터에 접근할 수 있다. 이는 가장 낮은 격리 수준을 가지며 높은 동시성을 제공한다.
많은 성능이 요구되고 데이터 무결성 문제가 크게 우려되지 않는 경우에 사용할 수 있다. 그러나 실제로는 거의 사용되지 않는다.
READ UNCOMMITTED: A 사용자가 트랜잭션에서 데이터를 추가하는 동안(연산 중, 커밋 및 롤백 여부 미정), B 사용자가 이 데이터를 읽을 수 있다.
Read Committed
READ COMMITTED는 커밋된 데이터만 조회할 수 있는 격리 수준이다.
다른 트랜잭션이 커밋되지 않은 데이터는 볼 수 없다.
예를 들어, 동일한 트랜잭션 내에서 입금을 여러 번 할 경우, 조회할 때마다 입금된 내역이 달라질 수 있다. 이는 "논리적 불일치(Non-repeatable Read)"가 발생할 수 있음을 의미한다.
대부분의 일반적인 OLTP(Online Transaction Processing) 시스템에서 사용된다.
READ COMMITTED: A 사용자가 데이터를 추가하고 커밋하기 전까지, B 사용자는 이 데이터를 읽을 수 없다.
Repeatable Read
REPEATABLE READ는 트랜잭션이 시작된 시점 이후 다른 트랜잭션이 수정한 데이터를 읽을 수 없게 한다. 트랜잭션이 여러 번 동일한 데이터를 읽을 때 항상 같은 결과를 반환한다.
그러나 새로운 레코드의 추가는 막지 않기 때문에 "팬텀 리드(Phantom Read)"가 발생할 수 있다.
예를 들어, SELECT로 조회한 경우 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견될 수 있다.
이는 MVCC(Multi-Version Concurrency Control) 덕분에 일반적인 조회에서는 발생하지 않는다. 왜냐하면 자신보다 나중에 실행된 트랜잭션이 추가한 레코드는 무시하면 되기 때문이다.
REPEATABLE READ: A 사용자가 트랜잭션을 시작한 후 데이터를 읽으면, B 사용자가 데이터를 수정하더라도 A 사용자는 동일한 데이터를 계속해서 읽을 수 있다.
Serializable
SERIALIZABLE은 가장 높은 수준의 격리 수준으로, 모든 트랜잭션을 순차적으로 실행하는 것처럼 보이게 한다. 이는 완전한 격리를 보장하며, 가장 낮은 동시성을 가진다. 데이터 일관성이 절대적으로 중요한 경우, 예를 들어 금융 거래 시스템에서 사용된다.
SERIALIZABLE: A와 B 사용자가 각각 트랜잭션을 시작할 때, 한 사용자가 트랜잭션을 완료하기 전까지 다른 사용자는 트랜잭션을 진행할 수 없다.
'mysql' 카테고리의 다른 글
# 서브쿼리 이해해보기 (0) | 2024.08.06 |
---|---|
동시성문제의 필요성 (0) | 2024.07.19 |
트랜잭션 정리글 및 이해하기 [1편] (0) | 2024.07.15 |
jdbc PreparedStatement (0) | 2023.08.01 |
tool을 이용하여 E-R다이어그램 설계방법 (0) | 2023.07.25 |