반응형

비관락 <-> 낙관락

  • 비관락: 데이터가 수정될 것이라고 가정하고, 데이터를 조회하거나 수정할 때 다른 트랜잭션이 접근하지 못하도록 미리 락을 거는 방식입니다.
  • 낙관락: 데이터 충돌이 적을 것으로 보고, 충돌이 발생했을 때만 문제를 해결하는 방식입니다. 버전 번호나 타임스탬프를 이용해 데이터가 변경되었는지 확인합니다.
  • 2023.01.12 - [개발/spring] - [jpa] lock종류와 사용 시 주의사항

베타락 <-> 공유락

  • 베타락: 데이터에 대해 하나의 트랜잭션만 읽기와 쓰기를 모두 할 수 있게 하는 락으로, 다른 트랜잭션은 해당 데이터를 읽거나 쓸 수 없습니다.
  • 공유락: 데이터 읽기 작업에서는 여러 트랜잭션이 동시에 접근할 수 있도록 허용하는 락으로, 읽기는 가능하지만 쓰기는 불가능합니다.

쓰기락 <-> 읽기락

  • 쓰기락: 데이터에 대해 쓰기 작업을 독점으로 수행할 수 있게 해 주는 락입니다. 락이 걸려 있는 동안에는 다른 트랜잭션에서 읽기와 쓰기 작업이 모두 불가능합니다.(쓰기를 위한 충돌관리; 충돌 시 쓰기 작업 보장)
  • 읽기락: 읽기 작업을 수행하는 동안 다른 트랜잭션이 쓰기 작업을 할 수 없도록 하지만, 여러 트랜잭션이 동시에 읽기 작업을 할 수 있게 합니다.

베타락 = 쓰기락 / 공유락 = 읽기락

비관락/낙관락  쓰기락/읽기락 은 관점의 차이 비관락/낙관락 안에도 쓰기락/읽기락 가능

비관적 락과 쓰기 락의 관계

  • 비관적 락의 구현 방식 중 하나가 쓰기 락: 비관적 락은 데이터의 변경을 안전하게 처리하기 위해 데이터베이스에서 락을 거는 개념이며, 이를 구현하는 방법 중 하나가 쓰기 락입니다. 비관적 락을 사용하여 충돌을 방지하려면 데이터 접근 시 다른 트랜잭션의 접근을 차단해야 하므로, 쓰기 락을 통해 데이터의 독점적인 접근 권한을 설정하는 경우가 많습니다.
  • 공통점: 비관적 락과 쓰기 락 모두 다른 트랜잭션이 데이터에 접근하지 못하도록 제어하는 역할을 합니다.
  • 차이점: 비관적 락은 충돌 방지를 위한 전체적인 전략이고, 쓰기 락은 비관적 락을 구현하는 구체적인 방법 중 하나입니다. 쓰기 락은 단순히 쓰기 작업이 수행되는 동안의 락이지만, 비관적 락은 읽기 또는 쓰기 작업 중에 락을 걸어 잠재적인 충돌을 방지할 수 있습니다.

 


MySQL에서 SELECT ... FOR UPDATE는 행 수준의 쓰기 락을 걸지만, 실제로는 동일한 트랜잭션 내에서만 데이터의 읽기와 수정에 대한 배타적 접근을 보장합니다. 다른 트랜잭션에서는 쓰기 작업은 막히지만 읽기 작업은 허용하는 것이 MySQL의 기본 동작입니다. 이 특징은 특히 InnoDB 엔진을 사용하는 경우에 적용됩니다.

왜 읽기 락이 걸리지 않는가?

MySQL의 InnoDB 엔진에서는 SELECT ... FOR UPDATE가 특정 행에 대해 **공유 락이 아닌 배타적 락(exclusive lock)**을 설정하여 다른 트랜잭션이 해당 행을 수정하지 못하도록 합니다. 그러나 읽기 작업은 차단하지 않습니다. 이는 SELECT ... FOR UPDATE가 쓰기 충돌을 방지하는 데 중점을 두는 방식 때문입니다.

이 방식은 동시성(concurrency)을 최대한 유지하기 위한 MySQL InnoDB의 최적화된 동작 방식으로 볼 수 있습니다. 다시 말해, 읽기 락까지 걸어 데이터 접근을 완전히 차단할 필요가 없는 경우라면, 다른 트랜잭션에서 해당 데이터를 읽는 작업은 허용합니다.

만약 읽기 작업까지 완전히 차단하고 싶다면?

MySQL에서 데이터의 읽기와 쓰기 모두를 차단하려면 명시적 테이블 락을 걸어야 합니다.

  • 테이블 락으로 읽기/쓰기 모두 차단
LOCK TABLES MY_TABLE_NAME WRITE;
  • 이 명령은 테이블 전체에 대해 락을 설정하여 다른 트랜잭션의 읽기와 쓰기를 모두 막습니다.
  • 또는 트랜잭션 격리 수준 조정: 트랜잭션 격리 수준을 SERIALIZABLE로 설정하여, 현재 트랜잭션이 완료되기 전까지 다른 트랜잭션이 해당 행에 접근하는 것을 완전히 막을 수도 있습니다.

InnoDB에서 SELECT ... FOR UPDATE의 읽기 허용 특성은 데이터베이스 성능 동시성 유지를 위한 트레이드오프이며, MySQL의 특징 중 하나로 이해할 수 있습니다.

728x90
반응형

'개발 > sql' 카테고리의 다른 글

[mysql] order by null  (0) 2024.12.19
[파티셔닝] 하는법, 쓰는법  (0) 2024.11.25
2 Phase Lock & mysql -> MVCC  (3) 2024.11.06
[분산] mysql 네임드락  (0) 2024.11.01
[p6spy] 설정 방법  (0) 2024.10.21

+ Recent posts