Post

TIL- @Transactional이란?

2024-06-13

오늘의 학습 🌠


1


트랜잭션이란?


  • 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 어노테이션을 붙여 해당 문제를 해결할 수 있습니다.

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.