BackEnd/Database

DB 락

연향동큰손 2025. 1. 19. 19:01

서로 다른 세션에서 동시에 같은 데이터를 수정하게 되면 치명적인 오류가 발생한다.

 

이러한 문제를 방지하기 위해 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에 서 해당 데이터를 수정할 수 없게 막아야 하는데 이러한 기능을 하는게 DB 락 이라는 개념이다.

 

 

<예시>

 set autocommit false;
 update member set money=500 where member_id = 'memberA';

 

세션1에서 락을 획득하고 money를 500으로 변경하고 커밋을 안했다.

 

 

 SET LOCK_TIMEOUT 60000;
 set autocommit false;
 update member set money=1000 where member_id = 'memberA';

 

이때 세션2에서 money를 1000으로 수정하려고 하는데 아직 락이 세션1에 존재한다.

 

따라서 SET LOCK_TIMEOUT 60000 를 통해 락 획득 시간을 60초로 설정한다.

 

여기서 60초 내에 세션1에서 커밋을 하게되면 세션1이 락을 반납하게 되고 세션2가 락을 획득하게 된다.

 

 

 

그 후 세션2가 락을 획득하게되고 세션2의 sql도 정상적으로 수행되면 락을 반납하게 된다.

 

 

조회

 

단순하게 조회를 할때는 락이 필요 없다.

 

하지만 조회 할때도 락을 획득하여 다른 세션에서 데이터를 수정하는것을 막을 수 있다.

 

아래 SQL과 같이  select for update 구문을 사용하면 조회를 하면서 동시에 선택한 로우의 락도 획득한다.

 set autocommit false;
 select * from member where member_id='memberA' for update;

 

'BackEnd > Database' 카테고리의 다른 글

스프링 예외 추상화  (0) 2025.02.04
TransactionTemplate  (0) 2025.02.01
커넥션 풀 / DataSource  (0) 2025.01.13
데이터베이스 연결, JDBC개발 - 등록, 조회, 수정 ,삭제  (0) 2025.01.12
JDBC란 무엇인가  (0) 2025.01.11