데이터베이스의 상태를 변환 시키는 하나의 논리적인 기능의 작업 단위를 말한다. 데이터 베이스를 다루다 보면, 쿼리 한 줄로 해결할 수 없는 경우가 많다. 또, 여러개의 쿼리가 처리되는 상황에서 문제가 생긴다면, 시스템 전체에 큰 문제가 발생한다.
예시로, 게임 홈페이지에서 캐쉬를 충전한 후, 아이템을 구매하여 먼저 받은 후, 캐쉬가 감소하는 시점에서 서버 전체의 전원이 나간 경우를 생각해보자. 이 상황에서 유저는 아이템을 구매해서 인벤토리에 존재하지만, 잔여 캐쉬는 그대로인 경우가 생길 수 있다. 이것은 게임회사에게 엄청난 비용적 손실을 유발할 것이다.
위와 같은 예시를 방지하기 위해 Transaction 기술이 탄생하였다.
DBMS에서 중요한 부분을 담당한다. SELECT, INSERT, UPDATE, DELETE 등의 작업을 하나의 논리적인 작업 단위로 수행하는 일련의 작업을 말한다. 쉽게 말해, 데이터베이스 작업을 위해 수행하는 작업의 단위를 말한다.
작업단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미한다.
다음 상황을 생각해보자. "캐쉬로 아이템을 구매하고, 인벤토리에 아이템이 추가된다." 이 상황을 순차적으로 표현해보면, 다음과 같다.
여기서의 작업 단위는 SELECT, INSERT, UPDATE 모두를 합친 것을 말한다.
이러한 작업단위를 하나의 트랜잭션이라 한다.
트랜잭션은 ACID를 보장해야 한다.
Spring은 코드 기반의 트랜잭션 및 선언적 트랜잭션을 지원한다.
일반적으로, 서비스 계층(Service Layer)에서 @Transactional을 추가하여 처리한다.
@RequiredArgsConstructor
@Service
public class PostsService {
private final PostsRepository postsRepository;
@Transactional
public Long save(PostsSaveRequestDto requestDto) {
return postsRepository.save(requestDto.toEntity()).getId();
}
@Transactional
public Long update(Long id, PostsUpdateRequestDto requestDto) {
Posts posts = postsRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id = " + id));
posts.update(requestDto.getTitle(), requestDto.getContent());
return id;
}
public PostsResponseDto findById (Long id) {
Posts entity = postsRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id = " + id));
return new PostsResponseDto(entity);
}
@Transactional(readOnly = true)
public List<PostsListResponseDto> findAllDesc() {
return postsRepository.findAllDesc().stream()
.map(PostsListResponseDto::new)
.collect(Collectors.toList());
}
}
DB Isolation Level (0) | 2020.06.26 |
---|---|
관계형 데이터 모델링의 흐름 (0) | 2020.06.16 |
데이터베이스 정의 (0) | 2020.06.15 |