트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준으로 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 수준입니다.
즉, 여러 개의 트랜잭션이 동시에 실행될 때 어떤 트랜잭션의 변경 내용이 다른 트랜잭션에게 보이는지와 관련된 개념입니다. 이러한 격리수준은 데이터베이스 시스템에서 동시성 제어와 관련하여 어떤 수준의 격리를 보장할지 결정하는 중요한 요소입니다.
데이터베이스는 ACID 특징과 같이 트랜잭션이 독립적인 수행을 하도록 합니다.
따라서 Locking을 통해, 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요합니다.
하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면 데이터베이스의 성능은 떨어지게 될 것입니다.
그렇다고 해서, 성능을 높이기 위해 Locking의 범위를 줄인다면, 잘못된 값이 처리될 문제가 발생하게 됩니다.
-> ❗️ 따라서 최대한 효율적인 Locking 방법이 필요하게 되었습니다.
트랜잭션에서 Locking과 Unlocking은 동시성 제어를 위해 사용되는 개념입니다.
Locking : 트랜잭션이 데이터를 읽거나 수정할 때, 해당 데이터에 잠금을 걸어 다른 트랜잭션이 해당 데이터를 변경하지 못하도록 막는 것을 의미합니다. 데이터에 잠금을 걸어 다른 트랜잭션의 간섭을 방지하여 일관성을 유지합니다.
Shared Lock : 다른 트랜잭션은 읽을 수는 있지만, 수정할 수 없는 상태로 데이터에 잠금을 걸어 해당 트랜잭션이 데이터를 사용 중임을 알립니다. 여러 트랜잭션이 동시에 동일한 데이터를 읽을 수 있습니다.
Exclusive Lock : 다른 트랜잭션이 해당 데이터를 읽거나 수정할 수 없도록 완전히 잠금을 걸어 다른 트랜잭션의 간섭을 막습니다. 하나의 트랜잭션이 해당 데이터를 사용 중일 때 다른 트랜잭션은 해당 데이터에 접근할 수 없습니다.
Unlocking : 트랜잭션이 데이터 조작을 완료하거나 롤백할 때, 해당 데이터에 걸려있던 잠금을 해제하여 다른 트랜잭션이 해당 데이터에 접근하고 변경할 수 있도록 허용합니다.
SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층
SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층
트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층
레벨이 높아질수록 트랜잭션 간 고립 정도는 높아지지만 성능이 떨어집니다.
Isolation Level에 대한 조정은, 동시성과 데이터 무결성에 연관되어 있습니다.
동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 되고 레벨을 높게 조정할 수록 발생하는 비용이 증가합니다.
Dirty Read
Non-Repeatable Read
Phantom Read
피드백 및 개선점은 댓글을 통해 알려주세요😊