트랜잭션(Transaction)

마동찬·2023년 7월 26일

📌Transaction?

데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미합니다.

즉, 병행 제어 시 처리되는 작업의 논리적 단위입니다.

Transaction은 하나의 흐름으로 하나의 실행이 성공하거나 실패하면 모든 연산들을 동일하게 처리합니다.

A, B, C의 연산을 한 묶음이라고 할 때 A는 정상 작동 됐지만,

B가 실패한다면 A의 작업 이력도 이전으로 돌립니다.

모든 작업이 성공한다면 완료 작업 상태를 모두 반영하고, 이것을 Commit이라고 합니다.

반면, 하나라도 실패하게 된다면 모든 사항을 폐기하고, 이것을 Rollback이라고 합니다.


📌트랜잭션의4가지 성질 ( ACID 원칙 )

✔️ Atomicity 원자성

: 한 트랜잭션 내의 실행 작업은 하나의 단위로 처리

즉, 모두 성공 또는 모두 실패하는 것을 의미합니다.

✔️ Consistency 일관성

: 트랜잭션은 일관성 있는 데이터베이스 상태를 유지

제약조건이나 데이터 규칙에 위반하지 않는 일관성을 의미합니다.

하나의 동작이 정상적인 흐름을 일관적으로 가질 수 있어야 한다는 원칙입니다.

✔️ Isolation 독립성

: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 독립

격리성이라고도 합니다.

하나의 동작 중 다른 트랜잭션의 개입으로 데이터가 변경되어서는 안되겠죠?

따라서, 한 동작이 독립적으로 처리해야한다는 원칙입니다.

✔️ Durability 영속성

: 트랜잭션을 성공적으로 마치면 결과가 항상 저장

트랜잭션의 동작이 성공 후 Commit 된다면 영원히 반영되어야 한다는 원칙입니다.


📌트랜잭션의 관리와 종류

💡 비즈니스 로직과 트랜잭션 코드의 분리

비즈니스 로직과 트랜잭션 처리 로직이 동시에 존재한다면?
코드의 중복이 생길 수 있고 비즈니스 로직에만 집중하기 어렵다.

비즈니스 로직에만 집중하기 위해 Spring은 크게 2가지 트랜잭션 기술을 지원해준다.

1. TransactionTemplate

데이터 접근 기술에는 JdbcTemplate, JPA 등 여러가지가 존재한다. 이 기술이 바뀌면 트랜잭션을 사용하는 방법도 달라진다. Spring에서는 이러한 상황을 고려해 트랜잭션에 대한 추상화를 지원한다. PlatformTransactionManager 인터페이스를 이용하면 된다. 해당 인터페이스는 총 3가지 메서드를 제공한다.

  • getTransaction(): 현재 TransactionStatus를 return
  • commit(): 변경 내역 커밋
  • rollback(): 변경 내역 롤백

TransactionTemplate은 위의 Transaction Manager를 주입 받아 사용한다. 해당 클래스를 이용해 개발자가 트랜잭션 시작/종료 지점을 명시적으로 결정할 수 있게 된다.

2. @Transactional 어노테이션

또는 @Transactional 어노테이션을 지원해준다. 우리는 DB와 관련된, 트랜잭션이 필요한 클래스 혹은 메서드에 @Transactional 어노테이션을 달기만 하면 된다.
(+참고로 클래스에 다는 경우, 해당 클래스 및 하위 클래스까지 적용된다.)


👉 @Transactional의 동작 구조

스프링의 트랜잭션 AOP는 @Transactional을 인식하여 트랜잭션 프록시를 적용한다.
프록시는 '대리인'이라는 뜻인데 Aspect와 @Transactional을 적용한 클래스 or 메서드인 Target을 연결해주는 역할을 한다.

  1. Client가 API 호출
  2. 프록시 실행
  3. 트랜잭션 코드 실행
  4. 비즈니스 로직 실행
  5. 트랜잭션 코드 실행 (commit / rollback)

Ref. https://yeonyeon.tistory.com/223

profile
새내기개발자 성장기록

0개의 댓글