TIL- @Transactional이란?
2024-06-13
오늘의 학습 🌠
트랜잭션이란?
DB의 상태를 변화시켜 수행하는 작업의 단위를 뜻합니다.
데이터베이스의 상태를 변화시킨다는 것은 간단히 말해 질의어(SQL)를 이용하여 데이터베이스를 접근하는 것을 의미합니다. 바로 이전 커밋 이후의 작업부터 - 작업 후 최종적으로 커밋을 날리기까지의 주기입니다.
- 트랜잭션 특징
원자성 : 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다
일관성 : 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다
독립성 : 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.
지속성 : 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다
@Transactional
은 해당 어노테이션이 적용되는 메서드를 하나의 트랜잭션으로 묶어주는 역할을 합니다.- 구매자가 판매자에게 금액을 송금하는 코드를 예시로 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
@Autowired
private Buyer buyer;
@Autowired
private Seller seller;
public void buy() {
buyer.send();
seller.receive();
}
트랜잭션을 사용하지 않았을 때 receive() 메서드 자체에 문제가 생겨 항상 send()까지는 실행되고 receive() 메서드는 실행이 되지 않을 경우 구매자는 돈을 보내서 DB에는 금액이 줄었지만, 판매자는 입금이 되지 않아 DB상 금액 변동이 없는 문제가 생기게 됩니다.
따라서 transaction을 걸어 receive()가 실행되지 못하고 에러가 난 경우 send() 또한 Rollback 시켜 원상복구를 해야됩니다.
여기서 Rollback이란 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시키는 것을 말합니다.
1
2
3
4
5
6
7
8
9
10
11
12
@Autowired
private Buyer buyer;
@Autowired
private Seller seller;
@Transactional
public void buy() {
buyer.send();
seller.receive();
}
- 이를 해결하기 위해 다음과 같이 @Transaction 어노테이션을 붙여 해당 문제를 해결할 수 있습니다.
🐱🏍— —🤸🏻♀️ ~~~ 야~호~