낙관적 락과 비관적 락

parkrootseok·2025년 4월 10일
0

데이터베이스

목록 보기
7/10
post-thumbnail

낙관적 락과 비관적 락은 언제 사용할까?

낙관적 락과 비관적 락은 데이터베이스 트랜잭션 동시성 제어를 위한 주요 기법입니다. 데이터 무결성을 유지하면서 여러 트랜잭션이 동시에 데이터에 접근할 때 발생할 수 있는 충돌을 해결할 때 사용합니다.

낙관적 락과 비관적 락에 대해 알아보자

낙관적 락이란?

낙관적 락은 데이터 충돌이 적을 것으로 가정하고, 데이터를 읽을 때 락을 설정하지 않고 트랜잭션이 데이터를 수정할 때 충돌이 발생하지 않았는지 확인하는 방식입니다. 보통 Version과 같은 별도의 구분 컬럼을 사용해서 데이터가 변경되었는지 확인하며, 충돌이 발생하면 데이터베이스가 아닌 애플리케이션에서 직접 롤백하거나 재시도 처리를 해야합니다.

비관적 락이란?

비관적 락은 데이터의 충돌이 많은 것으로 가정하고, 트랜잭션이 시작될 때 공유락 또는 베타락을 설정하여 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 하는 방식입니다.

공유락과 베타락이란?

  • 공유락 : 다른 트랜잭션에서 읽기는 가능하지만, 쓰기는 불가능한 방식
  • 베타락 : 다른 트랜잭션에서 일기/쓰기 모두 불가능한 방식
    • 단, MySQL은 베타락이 걸려 있어도 단순 SELECT로 조회 가능

그럼, 두 락의 차이는 무엇일까?

충돌 가능성

낙관적 락은 충돌이 잦을 것이라고 가정하지만, 비관적 락은 그렇지 않습니다.

데이터베이스 락 사용 여부

낙관적 락은 락을 사용하지 않고, 비관적 락은 트랜잭션이 시작될 때 락을 설정합니다.

성능

낙관적 락은 락을 설정하지 않기 때문에 성능적으로 더 우세합니다. 하지만, 충돌이 발생할 경우 롤백하거나 재시도 처리를 해야하기 때문에 예상치 못한 성능 저하 가능성이 있습니다. 비관적 락은 락을 설정하기 때문에 다른 트랜잭션이 대기해야 하므로 성능이 저하될 수 있습니다.

언제, 어떤 락을 사용할까요?

  • 데이터 무결성과 충돌 가능성이 높을 경우 -> 비관적 락
  • 조회 작업이 빈번하며 동시 접근 성능이 중요한 경우 -> 낙관적 락

결론

낙관적 락은 충돌이 발생하면 해결하는 방식이고, 비관적 락은 충돌 자체를 만들지 않는 방식이다.

profile
동료들의 시간과 노력을 더욱 빛내줄 수 있는 개발자가 되고자 노력합니다.

0개의 댓글