낙관적 락과 비관적 락은 데이터베이스 트랜잭션 동시성 제어를 위한 주요 기법입니다. 데이터 무결성을 유지하면서 여러 트랜잭션이 동시에 데이터에 접근할 때 발생할 수 있는 충돌을 해결할 때 사용합니다.
낙관적 락은 데이터 충돌이 적을 것으로 가정하고, 데이터를 읽을 때 락을 설정하지 않고 트랜잭션이 데이터를 수정할 때 충돌이 발생하지 않았는지 확인하는 방식입니다. 보통 Version과 같은 별도의 구분 컬럼을 사용해서 데이터가 변경되었는지 확인하며, 충돌이 발생하면 데이터베이스가 아닌 애플리케이션에서 직접 롤백하거나 재시도 처리를 해야합니다.
비관적 락은 데이터의 충돌이 많은 것으로 가정하고, 트랜잭션이 시작될 때 공유락 또는 베타락을 설정하여 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 하는 방식입니다.
공유락과 베타락이란?
- 공유락 : 다른 트랜잭션에서 읽기는 가능하지만, 쓰기는 불가능한 방식
- 베타락 : 다른 트랜잭션에서 일기/쓰기 모두 불가능한 방식
- 단, MySQL은 베타락이 걸려 있어도 단순 SELECT로 조회 가능
낙관적 락은 충돌이 잦을 것이라고 가정하지만, 비관적 락은 그렇지 않습니다.
낙관적 락은 락을 사용하지 않고, 비관적 락은 트랜잭션이 시작될 때 락을 설정합니다.
낙관적 락은 락을 설정하지 않기 때문에 성능적으로 더 우세합니다. 하지만, 충돌이 발생할 경우 롤백하거나 재시도 처리를 해야하기 때문에 예상치 못한 성능 저하 가능성이 있습니다. 비관적 락은 락을 설정하기 때문에 다른 트랜잭션이 대기해야 하므로 성능이 저하될 수 있습니다.
낙관적 락은 충돌이 발생하면 해결하는 방식이고, 비관적 락은 충돌 자체를 만들지 않는 방식이다.