서로 다른 세션에서 동시에 같은 데이터를 수정하게 되면 치명적인 오류가 발생한다.
이러한 문제를 방지하기 위해 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전까지 다른 세션에 서 해당 데이터를 수정할 수 없게 막아야 하는데 이러한 기능을 하는게 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 |