DB락

wangjh789·2022년 8월 13일
0

[Spring] 스프링-DB-1

목록 보기
8/15

세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 데이터를 수정하게 되면 여러가지 문제가 발생한다.

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

DB락

먼저 시작한 (변경을 시도하는) 트랜젝션이 해당 컬럼에 대한 락을 획득한다.이 때 설정한 대기 시간을 넘어가면 락 타임아웃 오류가 발생한다.
set lock_timeout 60000 D락 대기시간 60초 설정
-> 하나의 로우를 두개 이상의 트랜젝션이 수정하는 것은 불가능하다.

DB락 - 조회

보통 select SQL 문에는 락을 사용하지 않는다. 예를 들어 세션1이 트랜잭션을 시작해 로우A를 변경하고 있어도 세션2는 로우A의 임시 데이터가 아닌 이전 데이터를 조회할 수 있다.

조회 시점에 락이 필요한 경우에는 select for update 구문을 사용하면 된다.
select * from member for update;
세션A가 락을 건 조회를 하는 동안에 세션B는 해당 로우를 수정하지 못할 뿐 여전히 조회는 가능하다.

비즈니스 로직

트랜잭션은 비즈니스 로직이 있는 서비스 계층에서 시작해야 한다. 로직으로 인해 문제가 되는 부분을 함께 롤백해야 되기 떄문이다.
트랜잭션을 사용하는 서비스 계층에서 커넥션을 만들고 커밋 이후에 커넥션을 종료해야 한다. DB 트랜젝션을 사용하려면 커넥션을 유지해야 같은 세션을 사용할 수 있다.

profile
기록

0개의 댓글