본문 바로가기
Java & Kotlin/Spring

[Spring] 트랜잭션

by heekng 2021. 5. 26.
반응형

[Spring] 트랜잭션

service의 메소드가 하나의 mapper메소드(쿼리)만 사용한다면 예외 발생 후에 DB에는 변화가 없다.

하지만 하나의 트랜잭션이 여러 개의 mapper메소드(쿼리)를 순차적으로 실행 후 문제 발생 시 성공한 쿼리문만 반영되어 다시 직접 복구해야하는 문제가 발생한다.

이러한 문제를 막기 위해 스프링에서는 @Transactional 어노테이션을 사용하여 한개의 트랜잭션에 문제가 발생하였을 때 rollback을 통해 전체 트랜잭션이 모두 DB에 반영되지 못하도록 막아준다.

@Transactional
@Override
public int remove(Long rno) {
	log.info("remove........."+rno);
	board_mapper.updateReplyCnt(mapper.read(rno).getBno(), -1);
	return mapper.delete(rno);
}

위 코드의 경우 updateReplyCnt, read, delete 세가지 메소드를 이용한다.

각각의 메소드가 모두 DB데이터를 update, delete하기 때문에 중간에 하나의 쿼리가 실패한다면 그 뒤의 쿼리는 실행되지않아 문제가 생긴다.

이 때 @Transactional 어노테이션 하나만으로 중간의 쿼리가 실패하였을 때 다시 해당 service 메소드를 실행하기 이전 상태로 rollback해준다.

반응형