@Transactional을 사용하는 이유

thwang26·2023년 3월 9일

@Transactional 어노테이션은 데이터베이스 트랜잭션을 관리하는 데 사용되는 스프링 프레임워크의 어노테이션입니다.

이 어노테이션은 메서드나 클래스에 적용될 수 있으며, 이를 통해 해당 메서드나 클래스가 하나의 트랜잭션 내에서 실행되도록 보장할 수 있습니다. 이는 메서드 또는 클래스의 모든 데이터 액세스 작업이 원자적으로 실행되도록 하여 데이터 일관성과 무결성을 유지하는 데 도움이 됩니다.

@Transactional 어노테이션을 사용하면 스프링은 자동으로 트랜잭션을 시작하고, 메서드 실행 중에 예외가 발생하면 롤백하거나 커밋합니다. 이를 통해 개발자는 별도로 트랜잭션을 관리하지 않아도 되며, 간단하게 어노테이션을 추가함으로써 데이터베이스 작업의 원자성과 일관성을 보장할 수 있습니다.

예시
@Transactional annotation is used when you want the certain method/class(=all methods inside) to be executed in a transaction.

Let's assume user A wants to transfer 100$ to user B. What happens is:

  1. We decrease A's account by 100$
  2. We add 100$ to B's account
    Let's assume the exception is thrown after succeeding 1) and before executing 2). Now we would have some kind of inconsistency because A lost 100$ while B got nothing. Transactions means all or nothing. If there is an exception thrown somewhere in the method, changes are not persisted in the database. Something called rollback happens.

If you don't specify @Transactional, each DB call will be in a different transaction.

예를 들어, 사용자 A가 사용자 B에게 100달러를 송금하려고 한다고 가정해 봅시다. 일어나는 일은 다음과 같습니다.

  1. A의 계좌에서 100달러를 차감합니다.
  2. B의 계좌에 100달러를 추가합니다.

1번을 성공적으로 실행한 후 2번에서 예외가 발생한다면, A는 100달러를 잃고 B는 아무것도 얻지 못했기 때문에 일종의 불일치가 발생합니다. 트랜잭션은 모두 실행되거나 아무것도 실행되지 않아야 합니다. 메서드 내에서 예외가 발생하면 데이터베이스에 변경 사항이 유지되지 않고 롤백이라는 것이 발생합니다.
@Transactional을 지정하지 않으면 각 DB 호출은 서로 다른 트랜잭션에 속합니다.


출처
chat gpt- 스프링부트 환경에서 transactional 어노테이션을 사용하는 목적
[stackoverflow]What is the use of @Transactional with JPA and Hibernate?

profile
💻디버깅중

0개의 댓글