JDBC에서는 데이터 무결성을 보장하기 위해 다양한 수준의 잠금(Lock) 메커니즘을 제공합니다. 레코드 하나부터 데이터베이스 전체까지 특정 범위를 잠그면, 해당 범위 내의 값은 다른 트랜잭션이 변경할 수 없게 됩니다.
그렇다면 JDBC에서 사용할 수 있는 잠금은 몇 가지이며, 각각 어떤 차이가 있을까요? 아래에서 주요 잠금 유형을 자세히 살펴보겠습니다.
JDBC의 주요 잠금 유형
1. 행 및 키 잠금(Row and Key Locks)
행 및 키 잠금은 테이블 내의 특정 행(row)만 잠그는 방식입니다. 이 잠금을 활용하면 서로 다른 트랜잭션이 같은 테이블의 다른 행을 동시에 처리할 수 있으므로, 동시성(concurrency)을 크게 향상시킬 수 있습니다. 세밀한 단위의 작업에 적합하며, 대부분의 온라인 트랜잭션 처리(OLTP) 환경에서 기본적으로 사용됩니다.
2. 페이지 잠금(Page Locks)
페이지 잠금은 데이터가 저장되는 페이지(page) 단위로 잠그는 방식입니다. 한 행의 내용이 변경되면, 해당 행이 속한 페이지 전체가 잠기게 됩니다. 따라서 대량의 행을 한 번에 업데이트해야 하는 경우에 유용합니다. 다만 잠금 범위가 넓어지므로, 불필요하게 많은 행이 함께 잠길 수 있다는 점은 고려해야 합니다.
3. 테이블 잠금(Table Locks)
테이블 잠금은 말 그대로 테이블 전체를 잠그는 방식으로, 두 가지 종류가 있습니다.
- 공유 잠금(Shared Lock): 여러 트랜잭션이 동시에 데이터를 읽을 수 있지만, 누구도 수정할 수 없습니다. 읽기 작업 위주의 상황에 적합합니다.
- 배타적 잠금(Exclusive Lock): 하나의 트랜잭션만 접근할 수 있으며, 읽기와 쓰기 모두 독점합니다. 데이터 일관성이 중요한 갱신 작업에 사용됩니다.
4. 데이터베이스 잠금(Database Lock)
데이터베이스 잠금은 데이터베이스 전체를 잠그는 가장 강력한 잠금 방식입니다. 이 잠금을 사용하면 다른 데이터베이스의 트랜잭션이 현재 데이터베이스에 접근하는 것을 차단할 수 있습니다. 주로 백업, 스키마 변경 등 데이터베이스 전반에 걸친 중요한 관리 작업을 수행할 때 활용됩니다.
마무리
이처럼 JDBC의 잠금 시스템은 행·키 잠금, 페이지 잠금, 테이블 잠금, 데이터베이스 잠금 네 가지로 구분됩니다. 잠금 범위가 좁을수록 동시성은 높아지지만 관리 오버헤드가 커지고, 범위가 넓을수록 일관성은 강해지지만 성능 저하가 발생할 수 있습니다. 따라서 애플리케이션의 트래픽 패턴과 작업 특성에 맞는 적절한 잠금 수준을 선택하는 것이 중요합니다.