PNU Mini Bootcamp BE - 2일차-1-Locking문제(JPA test오류)

문진혁·2024년 7월 30일

PNU_Bootcamp_BE

목록 보기
7/19

Locking 문제와 Transaction 충돌

Spring Boot와 ORM을 사용할 때, 하나의 데이터베이스에 여러 애플리케이션이 접근할 경우 Locking 문제와 Transaction 충돌이 발생할 수 있습니다. 이 두 가지 문제는 데이터베이스의 일관성과 무결성을 해치는 주요 원인입니다. 아래에서 각각의 문제에 대해 자세히 설명하겠습니다.

1. Locking 문제

1.1. Locking의 개념

Locking은 데이터베이스에서 동시성 제어를 위해 사용되는 기법입니다. 여러 트랜잭션이 동시에 데이터에 접근할 경우, 데이터의 무결성을 보장하기 위해 Lock을 설정합니다. Lock은 두 가지 주요 유형이 있습니다:

  • Pessimistic Locking: 데이터를 읽을 때 Lock을 설정하여 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 하는 방식입니다. 이 방법은 데이터의 일관성을 보장하지만, 성능 저하를 초래할 수 있습니다.
  • Optimistic Locking: 데이터를 읽을 때 Lock을 설정하지 않고, 트랜잭션이 끝날 때 데이터의 버전을 확인하여 충돌이 발생했는지 확인하는 방식입니다. 이 방법은 성능이 좋지만, 충돌이 발생할 경우 예외가 발생할 수 있습니다.

1.2. Locking 문제의 예

Locking 문제는 다음과 같은 상황에서 발생할 수 있습니다:

  • Deadlock: 두 개 이상의 트랜잭션이 서로의 Lock을 기다리며 무한 대기 상태에 빠지는 경우입니다. 예를 들어, 트랜잭션 A가 데이터 1에 Lock을 걸고 데이터 2를 기다리며, 트랜잭션 B는 데이터 2에 Lock을 걸고 데이터 1을 기다리는 상황입니다. 이 경우, 데이터베이스는 하나의 트랜잭션을 강제로 롤백하여 Deadlock을 해결합니다.

  • Lock Timeout: Lock을 요청한 트랜잭션이 지정된 시간 내에 Lock을 얻지 못할 경우 발생하는 오류입니다. 이 경우, 트랜잭션은 실패하고 롤백되어야 합니다.

2. Transaction 충돌

2.1. Transaction의 개념

트랜잭션은 데이터베이스에서 수행되는 일련의 작업 단위를 의미합니다. 트랜잭션은 원자성, 일관성, 격리성, 지속성(ACID 속성)을 보장해야 합니다. 여러 트랜잭션이 동시에 실행될 때, 서로 간의 충돌이 발생할 수 있습니다.

2.2. Transaction 충돌의 예

Transaction 충돌은 다음과 같은 상황에서 발생할 수 있습니다:

  • 동시성 문제: 두 개의 트랜잭션이 같은 데이터를 동시에 수정하려고 할 때 발생합니다. 예를 들어, 트랜잭션 A가 특정 사용자의 잔액을 수정하고 있을 때, 트랜잭션 B가 같은 사용자의 잔액을 동시에 수정하려고 할 경우 충돌이 발생할 수 있습니다. 이로 인해 데이터 일관성이 깨질 수 있습니다.

  • OptimisticLockException: Optimistic Locking을 사용하는 경우, 한 트랜잭션이 데이터를 수정하기 전에 다른 트랜잭션이 해당 데이터를 수정한 경우 발생하는 예외입니다. 이 경우, 첫 번째 트랜잭션은 실패하고 롤백되어야 합니다.

3. 해결 방법

3.1. Locking 전략 조정

  • Pessimistic Locking을 사용하여 데이터에 Lock을 걸어 충돌을 방지합니다. 그러나 성능을 고려하여 필요한 경우에만 사용하는 것이 좋습니다.
  • Optimistic Locking을 사용할 경우, 충돌 발생 시 적절한 예외 처리를 통해 트랜잭션을 재시도하는 로직을 구현합니다.

3.2. 트랜잭션 관리

  • 트랜잭션의 Isolation Level을 조정하여 동시성 문제를 완화할 수 있습니다. 예를 들어, READ_COMMITTED 또는 SERIALIZABLE 레벨을 설정하여 데이터의 일관성을 높일 수 있습니다.

3.3. 재시도 로직 구현

트랜잭션이 충돌할 경우 자동으로 재시도하도록 설정하여 데이터 처리의 신뢰성을 높일 수 있습니다. Spring에서는 @Transactional 어노테이션과 함께 AOP를 사용하여 재시도 로직을 쉽게 구현할 수 있습니다.

결론

Locking 문제와 Transaction 충돌은 데이터베이스에서 발생할 수 있는 주요 이슈로, 애플리케이션의 데이터 일관성과 무결성에 큰 영향을 미칠 수 있습니다. 적절한 Locking 전략과 트랜잭션 관리를 통해 이러한 문제를 사전에 예방하고 해결하는 것이 중요합니다. 추가적인 질문이나 더 알고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요!

profile
멋진사람

0개의 댓글