Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

Spring Transactional

by Greedy 2024. 5. 9.

Transaction

데이터베이스에서 수행되는 작업 단위

데이터베이스 시스템이 보장해야 하는 성질

원자성 (Atomicity)

원자성은 트랜잭션이 완전히 성공하거나 완전히 실패하는 단일 단위로 처리되도록 보장한다.

즉, 트랜잭션 내에서 수행되는 모든 작업은 모두 성공하거나 모두 실패해야 한다.

어떤 작업이 실패하면 이전의 변경 사항은 롤백되어야 한다.

 

🍿 예시로 설명해보자~

Alice가 Bob에게 100달러를 송금하려는 트랜잭션을 생각해보자.

이 트랜잭션 내에서는 Alice의 계좌에서 100달러를 빼는 작업과 Bob의 계좌에 100달러를 추가하는 작업이 함께 수행된다.

Alice의 계좌에서 돈을 빼는 작업이 성공하고 Bob의 계좌에 돈을 추가하는 작업이 실패할 경우, Alice의 계좌에서 빼었던 돈이 롤백되어야 한다.

일관성 (Consistency)

일관성은 트랜잭션이 성공적으로 완료된 후에도 데이터베이스가 항상 일관된 상태를 유지하는 것

즉, 트랜잭션이 수행된 후에는 데이터베이스의 무결성 규칙이 계속 유지되어야 한다.

 

🍿예시로 설명해보자~

Alice가 Bob에게 100달러를 송금하는 트랜잭션이 성공적으로 완료된 후에는 Alice의 계좌에서 돈이 제대로 빠져나가고 Bob의 계좌에 돈이 정확하게 들어있어야 한다.

이러한 일관성은 트랜잭션이 데이터베이스에 올바르게 반영되어 데이터의 무결성을 유지하는 것을 보장한다.

격리 Isolation

한 트랜잭션의 작업이 완료되기 전에는 다른 트랜잭션이 해당 작업을 볼 수 없도록 하는 것

동시에 여러 사용자 또는 프로그램이 데이터베이스에 접글할 때 발생할 수 있는 문제를 방지한다

격리는 하나의 트랜잭션이 다른 트랜잭션의 작업에 영향을 미치지 않도록 보장한다

 

🍿예시로 설명해보자~

동시에 여러 사용자가 송금을 시도할 경우 격리가 필요하다.

예를 들어 Alice와 Carol이 동시에 Bob에게 송금을 시도한다고 가정해 보자.

트랜잭션 격리를 통해 Alice의 송금 트랜잭션이 완료되기 전까지는 Carol의 송금 트랜잭션에서 Bob의 계좌 변경 사항을 볼 수 없다.

이는 동시에 두 사람이 한 사람에게 돈을 보낼 때 발생할 수 있는 문제를 방지한다.

지속성 Durability

데이터베이스 시스템에서 지속성은 트랜잭션이 성공적으로 완료된 후에 해당 변경 사항이 영구적으로 보존되는 것을 의미한다. 즉, 시스템이 고장나거나 중단되어도 데이터베이스의 변경 사항은 유지된다.

 

🍿 예시로 설명해보자~

Alice가 Bob에게 100달러를 송금하는 트랜잭션이 성공적으로 완료된 후, 이 변경 사항은 데이터베이스에 영구적으로 저장된다.

따라서 시스템이 고장나거나 다시 시작되어도 Alice가 보낸 돈은 안전하게 보존된다.

Spring 의 @Transactional

Spring의 @Transactional은 트랜잭션을 관리하는 데 사용되는 어노테이션이다.

이를 이용하여 메서드 레벨 또는 클래스 레벨에서 트랜잭션 경계를 정의할 수 있다.

@Transactional을 사용하면 Spring 프레임워크가 자동으로 트랜잭션을 시작하고 종료하며, 필요한 경우 롤백을 수행하여 데이터베이스의 일관성을 보장한다.

트랜잭션의 전파 및 격리 수준을 지정하고 여러 속성을 사용하여 트랜잭션의 동작을 사용자 정의할 수 있다.

@Transactional 어노테이션은 애플리케이션에서 트랜잭션을 사용하도록 설정해야만 작동한다. Spring Boot에서는 spring-boot-starter-jdbc 또는 spring-boot-starter-data-jpa 종속성을 추가하여 트랜잭션을 활성화할 수 있다.

@EnableTransactionManagement 어노테이션을 사용하여 애플리케이션에서 트랜잭션 관리를 활성화할 수도 있다.

메서드에 적용

@Transactional
public void updateUser(User user) {
  // 데이터베이스 업데이트 수행
}

클래스에 적용

@Transactional
public class UserService {
  public void updateUser(User user) {
    // 데이터베이스 업데이트 수행
  }
}

@Transactional 어노테이션은 기본적으로 이미 트랜잭션이 존재하지 않을 경우 새로운 트랜잭션을 생성한다.

이미 존재하는 트랜잭션이 있는 경우에는 해당 메서드나 클래스가 이미 존재하는 트랜잭션 내에서 실행된다.

@Transactional 어노테이션은 AOP (Aspect-Oriented Programming)과 함께 사용하여 직접적으로 @Transactional로 표시되지 않은 메서드나 클래스에도 트랜잭션을 적용할 수 있다.

이렇게 하면 여러 메서드나 클래스에 일일히 어노테이션을 추가하지 않아도 된다.

@Transactional Settings

The @Transactional annotation is metadata that specifies that an interface, class, or method must have transactional semantics

default @Transactional 설정

  • The propagation setting is PROPAGATION_REQUIRED.
  • The isolation level is ISOLATION_DEFAULT.
  • The transaction is read-write.
  • The transaction timeout defaults to the default timeout of the underlying transaction system, or to none if timeouts are not supported.
  • Any RuntimeException or Error triggers rollback, and any checked Exception does not.

value

String

사용할 트랜잭션 매니저를 지정하는 선택적 한정자

transactionManager

String

value의 별칭

label

Array of String labels

label은 트랜잭션 관리자에 의해 실제 트랜잭션과 구현별 동작을 연결하는 데 사용된다

propagation

enum: Propagation

전파 범위 설정

isolation

enum: Isolation

격리 수준 설정

REQUIRED 또는 REQUIRES_NEW 값에만 적용

격리 수준이 높을수록 트랜잭션 간의 상호 작용이 엄격해지지만, 성능 저하의 가능성이 높아진다.

timeout

int

트랜잭션 제한 시간 설정

REQUIRED 또는 REQUIRES_NEW 값에만 적용

timeoutString

String
초 단위로 제한 시간을 문자열 값으로 지정하는 대체 옵션

readOnly

boolean

읽기 전용 트랜잭션

REQUIRED 또는 REQUIRES_NEW 값에만 적용

rollbackFor

Array of Class objects, which must be derived from Throwable.

롤백을 발생시켜야 하는 선택적 예외 유형의 배열

rollbackForClassName

Array of exception name patterns.

롤백을 발생시켜야 하는 선택적 예외 이름 패턴의 배열

noRollbackFor

Array of Class objects, which must be derived from Throwable.

롤백을 발생시켜서는 안 되는 선택적 예외 유형의 배열

noRollbackForClassName

Array of exception name patterns.

롤백을 발생시켜서는 안 되는 선택적 예외 이름 패턴의 배열

'Developing > TIL(Develop)' 카테고리의 다른 글

Spring mvc 패턴  (0) 2024.05.14
Spring JPA 상속 관계  (0) 2024.05.10
Spring AOP  (0) 2024.05.08
Spring IoC Container, Bean  (0) 2024.05.06
Spring Framework 란?  (0) 2024.05.06