일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 백준 1018 nodejs
- 백준 11047 javascript
- 백준 1449
- 백준 1018 타입스크립트
- 백준 1018 javascript
- 백준 1449 타입스크립트
- 백준 2503 javascript
- 백준 1018 typescript
- 백준 4796 타입스크립트
- 백준 11047 타입스크립트
- 백준 1449 nodejs
- 백준 2503 타입스크립트
- 백준 1449 javascript
- 백준 4796 nodejs
- 백준 11047 typescript
- 백준 2503 nodejs
- 백준 1449 노드
- 백준 11047 nodejs
- 백준 10448 javascript
- JavaScript
- 백준 1018 자바스크립트
- 백준 4796 자바스크립트
- 백준 4796 javascript
- 백준 2503 자바스크립트
- 백준 2503 typescript
- 백준 4796 캠핑
- CSS
- 백준 11047 자바스크립트
- 백준 1449 자바스크립트
- 알고리즘
- Today
- Total
POTATO THAT WANT TO BE HUMAN
[Java] Transaction Annotation 본문
트랜잭션이란,
데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야하는 연산들을 의미한다.
트랜잭션은
begin
,commit
을 자동으로 수행하며- 예외가 발생할 경우 자동으로
rollback
처리를 한다.
트랜잭션의 성질은 다음과 같다.
- 원자성
- 일관성
- 격리성
- 영속성
Transactional Annotation
을 사용하기 위해서는
다음과 같이 서비스 상단에 @Transactional
Annotation을 추가하면 된다.
@Transactional
public void userService(UserDTO dto) throws Exception {
// 서비스 로직
}
@Transactional
Annotation을 사용하면 서비스에 여러 쿼리가 있는 경우
하나의 쿼리에서 에러가 발생해도 위에서 실행된 쿼리들은 자동 rollback
된다.
그렇다면 모든 서비스에 Transactional Annotation
을 사용하지 않는 이유는 뭘까?
트랜잭션의 성질 중 격리성이 있다.
격리성이란, 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리하는 것을 말한다.
이처럼 트랜잭션이 실행 중이면 다른 트랜잭션은 격리되어 끼어들 수 없다. 그래서 트랜잭션을 걸어놓고 테이블에서 작업을 하게 되면 테이블에 LOCK을 먼저 걸어놓고 작업을 시작한다. LOCK이 걸린 사이에는 해당 테이블에서 다른 작업을 하지 못하고 LOCK이 풀릴 때까지 기다려야 한다.
이런 성질에서 답을 찾을 수 있다.
일단 테이블에 LOCK을 거는 것부터 cost가 들어가는 일이다.
예를 들어 하나의 테이블에 간단한 INSERT
작업을 하는데도 LOCK이 걸려 다른 작업을 수행하지 못한다고 하자.
이런 하나하나의 작업들이 쌓여 결국 시스템이 느려지는 결과를 부를 것이다.
개인 프로젝트나 프로젝트의 규모가 작은 경우엔 큰 영향을 미치지 않지만, 프로젝트가 커질수록 속도 측면에서 큰 차이를 보이게 된다.
사용자 측에서는 서비스가 3초 이상만 지연되어도 해당 서비스에 만족하지 못할 만큼 속도는 중요한 요소이다. 따라서 INSERT
, UPDATE
, DELETE
쿼리 여러 개가 하나의 서비스에서 수행되는 경우에만 Transactional Annotation을 사용하는 것이 바람직하다.
'BACKEND > Java & Spring' 카테고리의 다른 글
[Spring] mybatis 쿼리 작성 시 concat 사용하기 (0) | 2023.04.11 |
---|