1. Transaction이란 무엇이냐
성공과 실패밖이 존재하지 않는 과정이다. 여기서 성공이라는 것은 결과를 반영한다는 것이고 실패는 반영하지 않는 것을 의미한다. 무슨 결과일까? 그것은 바로 사용자가 의도한 결과이다.
2. Transaction 예시
밥을 먹는 행위를 예시를 들 수 있다. 만약 필자가 인도에 가서 손으로 밥을 먹어야하는 행위를 해야 하는데 숟가락을 주지 않는다면, 필자는 밥을 먹을 수 없다. 만약 필자가 손으로 밥을 잡고 입에 넣으면 "밥을 먹는다는 행위를 성공"하게 되는 것이고 위생 문제로 손으로 밥을 집는 행위를 하지 못하면 "밥을 먹는다는 행위를 실패"하게 되는 것이다. 필자 앞에 밥이 있어도, 밥을 집는 척만하고 손에 놓치 않고 먹는 척만 한다면 밥을 먹는 것이 아니라는 것이다. 필자가 밥을 먹는다는 트랜잭션을 성공하기 위해선 앞서 말한 2가지 모두가 성공해야한다.
3. CS 에선 이걸 왜쓰나요?
성공과 실패했을 경우의 결과만 반영하기 위해서이다. A 계좌에서 출금하고 B 계좌에 넣어야할 때, 출금에는 성공했지만 B 계좌가 오류가 생겨 넣지 못한다면 A 계좌에서 출금한 행위를 취소시켜야한다. 이런 경우 트랜잭션을 사용한다. 그리고 자바에서는 아래와 같이 Spring 어노테이션으로 지원해 준다.
// 계좌이체 로직
@Transactional
public void 계좌이체()
var money = A_은행에서_출금();
B_은행으로_송금(money);
}
4. 장단점
편리하고 데이터 무결성 및 일관성을 지켜준다. 트랜잭션을 쓰면 앞서 행한 행위, A 은행에서 출금한 행위를 자동으로 취소해준다. 이것을 Roll-Back이라고 해준다. 이로써 은행에서 돈이 안빠져나가 해당행위로 은행의 데이터는 일관성과 무결성이 유지된다.
단점으로는 성능저하, 데드락 위험이 존재한다. 성능저하는 상호배제를 하기위해 공유자원을 어떻게 사용해야 할 것인가에 대한 로직에서 발생되고 데드락은 서로가 원하는 공유자원을 상대가 쓰고 있을 때, 그 공유자원을 무한으로 대기해야하는 상황으로서 발생된다.