상세 컨텐츠

본문 제목

[JPA] Transaction Lock(트랜잭션 락)

Backend

by choiDev 2023. 12. 30. 22:05

본문

트랜잭션 락은 데이터베이스에서 여러 트랜잭션이 동시에 데이터에 접근하고 수정하는 것을 제어하기 위해 사용되는 메커니즘입니다. (동시성 이슈 해소용)

트랜잭션 락은 크게 2가지 유형으로 나뉩니다.

비관적 락(Pessimistic Locking) 이란?

  • 데이터를 읽을 때부터 업데이트가 완료될 때까지 해당 데이터를 다른 트랜잭션이 읽지 못하도록 락을 거는 방식입니다.
  • 락을걸고 있는 동안 다른 트랜잭션은 해당 데이터에 대한 읽기 및 쓰기 권한을 얻을 수 없습니다.

낙관적 락(Optimistic Locking) 이란?

  • 트랜잭션은 데이터를 읽을  때 락을 걸지 않고, 업데이트 시에 충돌을 감지 하기 위해 추가벙보(버전 번호등)을 사용합니다.
  • 데이터를 읽을때 버전 정보를 기록하고 업데이트 시에 읽었을때와 버전이 같은지 확인하여 충돌을 감지합니다.
  • 주로 버전필드를 사용하여 구현되면 JPA에서는 Version 어노테이션을 활용할수있습니다.
  • 동작 메커니즘은 @Version 부착된 필드가 버전 필드로 지정되며, 데이터를 수정할 때 같은 ID 값이지만 다른 사용자에 의한 변경이 발생하면 version 값이 바뀌게 되고 이때 예외가 발생하므로 충돌로 부터 안전하게 처리할 수 있습니다.

 


낙관적 락(Optimistic Locking)의 장점

1. 동시성이 높음: 여러 트랜잭션이 동시에 데이터를 읽을 수 있기 때문에 동시성이 향상됩니다.

2. 트랜잭션 충돌 최소화: 락을 걸지 않고 데이터를 읽기 때문에 트랜잭션 간 충돌이 발생할 확률이 적습니다.

3. 성능 개선: 락을 걸지 않기 때문에 비관적락보단 성능이향상됩니다.

낙관적 락(Optimistic Locking)의 단점

1. 트랜잭션 충돌 처리 필요: 데이터를 업데이트할 때 충돌이 발생할 경우, 추가적인 충돌 처리 로직이 필요합니다.

3. 트랜잭션 롤백 가능성: 충돌이 발생한 경우 트랜잭션을 롤백하고 재시도 해야 할 수 있습니다.


비관적락(Pessimistic Locking)의 장점

1. 데이터 일관성 보장 : 락을 걸어 다른 트랜잭션이 해당 데이터를 읽지 못하도록 하므로 동시성이슈에 대해 안전합니다.

2. 충돌 방지  : 다른 트랜잭션이 읽기나 쓰기를 시도할 때 락을 걸기 때문에 충돌이 발생하지 않습니다.

 

비관적락(Pessimistic Locking)의 단점

1. 성능감소: 락을 걸고 있으므로 동시성이 감소하고, 대기시간이 늘어납니다.

2. 데드락 가능성 : 락을 사용하다 보면 데드락이 발생할 수 있는 위험이 있습니다.

3. 자원의낭비 : 락을 걸고있는 동안 다른 트랜잭션들이 해당 자원을 사용하지 못하므로 자원의 낭비가 발생합니다.

 

 

예제코드 작성

관련글 더보기