❑ 트랜잭션(Transaction)이란?
트랜잭션 : 여러개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위
두 개 이상의 작업들이 그룹처럼 묶여서 처리될 수 있는데 하나라도 실패할 경우 애플리케이션의 신뢰성이 깨어지는 상황이 발생할 수 있다.
애플리케이션에서 신뢰성이 깨어지는 상황이 발생하면 트랜잭션이라고 부를 수 없다.
물리적으로는 여러 개의 작업이지만 논리적으로는 마치 하나의 작업으로 인식하는 경우
전부 성공 또는 전부 실패 (All or Nothing)로만 처리되어야 트랜잭션의 의미를 가진다.
➤ ACID 원칙
데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다.
1. 원자성 (Atomicity)
트랜잭션에서 작업을 더 이상 쪼갤 수 없다는 것을 의미한다.
모두 성공하거나 모두 실패하거나(All or Nothing)
2. 일관성 (Consistency)
트랜잭션이 에러없이 성공적으로 끝날 경우, 비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되는 것을 의미한다.
3. 격리성 (Isolation)
여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행되어야 함을 의미한다.
4. 지속성 (Durability)
트랜잭션이 완료되면 그 결과는 지속되어야 한다는 의미이다.
➤ 트랜잭션 커밋(commit)과 롤백(rollback)
▶️ commit
- 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어
- 커밋을 수행하면 변경된 내용이 DB에 영구적으로 저장된다.
- 커밋 명령을 수행하면 하나의 트랜젝션 과정은 종료하게 된다.
▶️ rollback
- 작업 중 하나라도 문제가 발생했을 경우 트랜잭션 내에서 수행된 작업들을 취소한다.
- 트랜잭션 시작 이전의 상태로 되돌아간다.
➤ JPA의 Entity Transaction commit() 내부 들여다보기
EntityTransaction 객체 commit() 메서드 호출 시 어떤 일이 일어날까?
EntityTransaction 인터페이스의 구현 클래스인 TransactionImpl 클래스의 commit()을 호출한다.
-> TransactionDriverControlImpl (물리적인 트랜잭션을 제어하기 위한 로컬 트랜잭션 드라이버 구현 객체) 를 얻은 후 구현 메서드인 commit()을 다시 호출한다.
-> TransactionDriverControlImpl 에서 JDBC Connection의 액세스 방법을 제공하는 JdbcResourceTransaction의 구현객체인 AbstractLogicalConnectionImplementor 의 commit()을 호출한다. (여기까지가 Hibernate ORM에서의 영역)
-> 물리적인 JDBC Connection을 통해 데이터베이스와 인터랙션하기 위해서 JDBC API의 구현체인 JdbcConnection 영역으로 이동한다.
-> (여기부터 JDBC API의 구현체인 H2의 영역) 데이터베이스에 commit 명령을 준비(prepareCommand)한 후, 명령을 실행(executeUpdate)한다.
-> Command 클래스에서 메서드 실행된다.
데이터베이스에 commit 명령을 전달하기 위해 commitIfNonTransactional 메서드 호출한다.
commitIfNonTransactional() 메서드 내부에서 auto commit 여부를 체크한 후
데이터베이스 세션에 해당하는 Session 객체를 통해 commit 명령을 수행한다.
만약에 commitIfNonTransactional() 수행 과정에서 예외가 발생하면 rollback을 수행한다.
-> SessionLocal 클래스에서 트랜잭션에 대한 commit이 수행된다.
읽어주셔서 감사합니다.
오개념에 대한 지적은 늘 환영입니다.
'TIL(Today I Learned)' 카테고리의 다른 글
7/21 (목) 인증 / 보안 기초 1️⃣ (0) | 2022.07.24 |
---|---|
7/11 (월) Spring Framework에서의 트랜잭션 처리 (0) | 2022.07.17 |
7/7 (목) [Spring MVC] JPA 기반 데이터 액세스 계층 3️⃣ - Spring Data JPA (0) | 2022.07.16 |
7/6 (수) [Spring MVC] JPA기반 데이터 액세스 계층 2️⃣ - JPA 엔티티(Entity)매핑과 연관관계 매핑 (0) | 2022.07.16 |
7/5 (화) [Spring MVC] JPA 기반 데이터 액세스 계층 1️⃣ - JPA란? (0) | 2022.07.14 |