개발 중 PessimisticLockException 이라는 에러를 만났다.
사실..아직 이 에러를 해결하려면 코드는 둘째치고 로직 자체를 다 다시 살펴보고 다시 짜야할 것 같아 아직..에러를 해결하지는 못했다..^^...
일단 아래는 내가 마주한 PessimisticLockException 에러다.
이 문제는..일단 차분히 해결해보도록 하고.
문득 PessimisticLockException 에러를 보면서 갑자기 '데드락(DeadLock)과는 다른 문제지?' 라는 생각이 떠올랐고 이 참에 정리해보고자 한다.
결론부터 말하자면, org.hibernate.PessimisticLockException와 데드락(Deadlock)은 다른 문제다.
PessimisticLockException
PessimisticLockException은 Hibernate에서 데이터베이스 액세스 중에 발생하는 예외로, 비관적인(판단적인) 잠금을 사용하는 경우 다른 트랜잭션과의 잠금 충돌을 나타낸다.
예를 들어, 트랜잭션 A가 특정 데이터를 수정 중일 때 트랜잭션 B가 동일한 데이터에 대해 수정을 시도하면 PessimisticLockException이 발생할 수 있다.
이는 데이터의 일관성을 유지하기 위해 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 하는 제어 메커니즘이다.
데드락(Deadlock)
반면, 데드락(Deadlock)은 두 개 이상의 프로세스 또는 스레드가 서로가 소유한 리소스를 기다리며 무한 대기 상태에 빠지는 상황을 말한다.
각 프로세스 또는 스레드는 다른 프로세스가 보유한 리소스를 얻기 위해 대기하면서 자신이 가진 리소스를 보유한 상태다.
이러한 상황에서는 아무리 대기 시간이 지나도 상호배제(Mutual Exclusion) 조건이 해제되지 않아 데드락이 발생하게 된다.
데드락은 일반적으로 프로그래밍 언어나 운영 체제 수준에서 다루어지며, 동시에 여러 개의 프로세스 또는 스레드가 상호작용하는 다중 스레드 환경에서 발생할 수 있다.
PessimisticLockException과 데드락은 모두 동시에 여러 개의 작업이 수행되는 환경에서 발생할 수 있는 문제이지만, PessimisticLockException은 데이터베이스 액세스 중에 발생하는 잠금 충돌에 관련된 것이고, 데드락은 다중 스레드 간 리소스 대기 상태에 관련된 것이다.
PessimisticLockException과 데드락(Deadlock)의 차이점
조금 더 정리해보자.
PessimisticLockException과 데드락(Deadlock)은 발생 시기, 원인, 해결 방법, 영향 범위 등에서 차이가 있다.
발생 시기
- PessimisticLockException : Hibernate에서 데이터베이스 액세스 중에 발생한다. 특히, 한 트랜잭션이 데이터를 수정하거나 읽는 동안 다른 트랜잭션이 해당 데이터에 액세스하려고 할 때 발생할 수 있다.
- 데드락(Deadlock) : 다중 프로세스 또는 스레드 간 리소스 대기 상태에 빠질 때 발생한다.
원인
- PessimisticLockException : 동일한 데이터에 대해 동시에 실행되는 트랜잭션들이 발생해 데이터베이스 잠금 충돌이 발생한 경우 발생할 수 있다.
- 데드락(Deadlock) : 다중 스레드 환경에서 두 개 이상의 프로세스 또는 스레드가 서로 소유한 리소스를 요청하는 상황에서 발생할 수 있다.
해결 방법
- PessimisticLockException : 데이터베이스 트랜잭션의 제어 메커니즘을 조정해 충돌을 방지하도록 수정해야 한다. 동시성 제어 메커니즘을 고려해 트랜잭션 충돌을 최소화할 수 있다.
- 데드락(Deadlock) : 프로그래밍 언어, 운영 체제 수준에서 다양한 기법과 알고리즘을 사용할 수 있다. 예를 들어, 상호배제(Mutual Exclusion) 조건을 해제하거나, 교착 상태 탐지 및 회피 알고리즘을 구현하여 데드락을 방지하거나 해결할 수 있다.
영향 범위
- PessimisticLockException : 주로 특정 데이터에 대한 트랜잭션 충돌과 관련되어 있기 때문에 해당 트랜잭션에서만 발생하며, 다른 트랜잭션들은 영향을 받지 않는다.
- 데드락(Deadlock) : 리소스와 관련된 모든 프로세스 또는 스레드가 영향을 받고, 전체 시스템의 작동을 멈출 수 있다.
일단 정리는 이 정도로 하고.. 예외 해결하러 가야겠다.