DeadLock
데이터베이스에 데드락이란 여러개의 트랜잭션이 실행되지 못하고 서로를 무한정 기다리고 있는 교착상태를 뜻한다.
교착상태란 두개 이상의 작업이 서로의 작업이 끝나기를 기다리고 있는 상태로 결과적으로 아무것도 완료되지 못한다.
Transaction
트랜잭션은 작업의 안정성을 보장해주는 것이다. 여러개의 작업을 하나의 논리적 단위로 묶어 반영과 원상복귀를 조정할 수 있게 하기 위해 사용된다. 사용자의 입장에서는 작업의 논리적 단위로 이해할 수 있고 시스템의 입장에서는 데이터들을 접근 혹은 변경하는 프로그램의 단위가 된다.
Locking(교착상태 예방)
로킹은 하나의 트랜잭션이 데이터를 액세스하는동안 다른 트랜잭션이 그 데이터 항목을 액세스할 수 없도록 하는 병행제어 기법이다. 사실상 필요한 데이터를 전부 로킹해주어야 해서 트랜잭션을 계속해서 처리하지 못하는 상태가 발생할 수 있다.
Wait-Die(교착상태 회피)
다른 트랜잭션이 데이터를 점유하고 있을때 기다리거나 포기하는 방식이다.
Wound-Wait(교착상태 회피)
다른 트랜잭션이 데이터를 점유하고 있을때 빼앗거나 기다리는 방식이다.
Time Stamp
트랜잭션을 기준으로 하는것이 아니라 각 데이터를 기준으로 하여 시간 순서대로 제어하는 기법이다. 트랜잭션에서 데이터를 처리하는 읽기와 쓰기로 나누어 계산하는 방법으로 처음부터 시간 순서대로 제어를 수행하여 먼저처리되고 있는 것이 있으면 양보한다.
낙관적 병행제어 기법
트랜잭션이 실행되는동안 아무런 검사를 하지 않고 트랜잭션이 다 실행 된 이후 검사하여 문제가 있다면 되돌리는 방법이다.
교착상태의 빈도를 낮추기 위해
- 트랜잭션을 자주 커밋한다.
- 정해진 순서대로 테이블에 접근한다.
- 읽기 잠금 획득(SELECT ~ FOR UPDATE)의 사용을 피한다.
- 한테이블의 복수 행을 복수로 연결하여 순서없이 갱신하면 교착상태가 발생하기 쉽다. 테이블 단위의 잠금을 획득해 갱신을 직렬화하면 동시성이 떨어지지만 교착상태를 피할 수 있다.
참고링크
https://velog.io/@yrkim/Database-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-deadlock
'database' 카테고리의 다른 글
[GraphQL] GraphQL이란? (0) | 2023.10.20 |
---|---|
[mongoDB] MongoDB에 대하여 (0) | 2023.01.17 |
[Oracle] 계층형 쿼리 (0) | 2022.12.26 |
Redis에 대하여 (0) | 2022.12.08 |