CS/DataBase

Lock, DeadLock, Blocking

prden 2023. 3. 10. 16:03

1. lock


SELECT FOR UPDATE : 검색하는 행에 LOCK을 거는 것 

1) SELECT FOR UPDATE 할 때 LOCK을 제어할 수 없으면 무한정 기다린다. 즉, 누군가 LOCK 중이면 무한정 기다린다. 
2) SELECT FOR UPDATE NOWAIT : SELECT 할 때 LOCK을 제어할 수 없으면 에러처리한다.
3) SELECT FOR UPDATE WAIT : 

1)shared lock : 읽기 잠금
- 여러 트랜잭션이 동시에 한 Row에 Shared Lock을 걸 수 있다. 즉, 여러 트랜잭션이 동시에 한 Row를 읽을 수 있다.
- Shared Lock이 걸려있는 Row에 다른 트랜잭션이 Exclusive Lock을 걸 수 없다.
- 즉, 다른 트랜잭션이 읽고 있는 Row를 수정하거나 삭제할 수 없다.
  
2)exclusive lock : 쓰기 잠금
- Exclusive Lock이 걸려있는 Row에는 다른 트랜잭션이 Shared Lock, Exclusive Lock 둘 다 걸 수 없다. 
 즉, 다른 트랜잭션이 수정하거나 삭제하고 있는 Row는 읽기, 수정, 삭제가 전부 불가능하다.
- Shared Lock을 사용하는 쿼리끼리는 같은 Row에 접근이 가능하다. 반면, Exclude Lock이 걸린 Row는 다른 어떠한 쿼리도 접근이 불가능하다.

Exclusive Lock은 SELECT ... FOR UPDATE나 UPDATE, DELETE 등의 수정 쿼리를 날릴 때 각 Row에 걸리는 Lock이다

- 누가 읽고 있으면 읽을 수는 있지만 , 수정하거나 삭제할 수 없다. 
- 누가 수정하거나 삭제하고 있으면 읽을수 없고, 수정할수 없고, 삭제할 수 없다. 
  
3)Record Lock :
Record Lock은 Row가 아니라 DB의 index record에 걸리는 Lock이다. 
여기도 row-level lock과 마찬가지로 Shared Lock과 Exclusive Lock이 있다.

4)Gap Lock :
 
5)Next-key Lock : 


2. Blocking : 


블로킹은 Lock들의 경합(Race condition이라고도 한다.)이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태를 의미한다. 
공유Lock과 배타적Lock 또는 배타적Lock과 배타적Lock끼리 블로킹이 발생할 수 있다.
이를 해결하는 방법은 Transaction commit 또는 rollback 뿐이다.
경합이 발생할 때, 먼저 Lock을 설정한 트랜젝션을 기다려야하기 때문에, 이런 현상이 반복되면 빠른 서비스를 제공할 수 없다.

해결방안

1) SQL 문장에 가장 빠르게 실행되도록 리펙토링하는 것이 가장 기본이며 효과적인 방법입니다.
2) 트랜젝션을 가능한 짧게 정의하면 경합을 줄일 수 있습니다.
3) 동일한 데이터를 동시에 변경하는 작업을 하지 않도록 설계하는 것이 좋습니다. 또한 트랜젝션이 활발한 주간에는 대용량 갱신 작업을 수행하면 안됩니다.
4) 대용량작업이 불가피할 경우, 작업단위를 쪼개거나 lock_timeout을 설정하여 해당 Lock의 최대시간을 설정할 수 있습니다.

3. Dead lock : 

deadlock은 트랜젝션간의 교착상태를 의미합니다. 
두개의 트랜젝션간에 각각의 트랜젝션이 가지고 있는 리소스의 Lock을 획득하려고 할 때 발생합니다.
서로의 세션간에 획득해야하는 리소스가 맞물리는 경우 잠금으로 인해 하나의 세션이 중지되지 않는 이상 빼도 박도 못하는 대치상황
https://hckcksrl.medium.com/deadlock-%EC%9D%B4%EB%9E%80-8100261a66c3 

 

DeadLock 이란

DeadLock

hckcksrl.medium.com


 
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=qowndyd&logNo=220997502798 

 

Lock의 구조와 이해

1. Lock 이란?오라클 데이터베이스는 DML문을 실행하면 해당 트랜잭션에 의해 발생한 데이터가 다른 사...

blog.naver.com

 
 

'CS > DataBase' 카테고리의 다른 글

ORACLE 파티셔닝  (1) 2023.04.21
ORACLE 쿼리 조인, 쿼리 튜닝  (0) 2023.03.10
Pro*C  (0) 2023.01.08
ORACLE 실행계획, Hint, SQL 튜닝  (0) 2022.12.31
ORACLE 식별자  (0) 2022.12.31