-
[Transaction] 트랜잭션 정리 - 1Spring/Study 2023. 6. 16. 15:55
본 정리는 Spring Boot와 연관지어 정리한 것입니다.
1. Transaction
1-1. 사전적 의미
트랜잭션의 사전적 의미는 "거래"이다.
A가 B에게 송금하고, B는 A에게 입금을 받는다. 이 행위를 통틀어서 거래라고 한다.
1-2. 개념
커밋 Commit
A의 송금과 B의 입금 두 행위 모두 성공하게 된다면? 데이터 베이스에 정보를 저장한다.
데이터베이스에 저장(반영)하는 것을 커밋(Commit) 이라고 한다.
롤백 Rollback
만약 A의 송금은 성공했는데, B의 입금 행위는 실패한다면? 커밋을 하면 안되고 A의 송금 행동을 되돌려야 할 것이다.
이 되돌리는 것을 롤백(Rollback) 이라고 한다.
1-3.트랜잭션 ACID
트랜잭션은 ACID라고 하는 Atomicity, Consistency, Isolation, Durability를 만족해야한다.
- 원자성 : 트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패해야한다.
- 일관성 : 모든 트랜잭션은 일관성 있는 DB 상태를 유지해야한다. 즉, DB는 무결성 제약 조건을 항상 만족해야한다.
- 격리성 : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치면 안된다. (격리 수준 설정 가능 총 4단계)
- 지속성 : 트랜잭션이 성공적으로 끝나면 항상 결과가 기록되어야 하고, 중간에 문제가 발생할 경우 이전 성공했던 내용을 복구해야한다.
트랜잭션 격리 수준 4단계
READ UNCOMMITED (커밋되지 않은 읽기)
READ COMMITTED (커밋된 읽기) - 일반적으로 많이 사용
REPETABLE READ (반복 가능한 읽기)
SERIALIZABLE (직렬화 가능)
2. DB 커넥션과 세션
2-1. 동작 순서
사용자의 요청
-> Spring Boot의 커넥션 풀에서 커넥션 하나 가져옴
-> DB에 연결된 커넥션이 세션을 실행
-> 세션은 트랜잭션 시작2-2. 세션의 개수
커넥션 1개당 세션 1개이다.
2-3. 세션이 Commit하지 않은 데이터는
다른 세션은 보지 못한다.
로직 수행중에 문제가 발생할 경우 롤백을 해야하기 때문에,
다른 세션에 영향을 미칠경우 되돌리기 어렵다.
따라서 Commit하지 않은 데이터는 다른 세션에서 조회하지 못한다.
3. 자동 커밋, 수동 커밋
3-1. 용도
SQL 쿼리 하나 실행하고 나서 일일이 커밋해주냐 안해주냐의 차이
3-2. 기본값
자동 커밋 모드이다.
3-3. 설정방법
SQL 커맨드 라인에
set autocommit true //true 는 자동 커밋, false 는 수동 커밋
으로 설정 한 뒤
수정 커밋이라면
commit // 커밋 수행 rollback // 롤백 수행
4. 정리
4-1. 원자성
원자성 특징으로 하나만 실패해도 모두 실패한 것으로 처리하여, 이전에 성공했던 작업들도 되돌린다.
4-2. 수동 커밋
자동 커밋은 SQL 쿼리를 실행하면 바로 저장되지만, 수동 커밋은 일일이 커밋을 해주기 전까지는 저장되지 않는다.
4-3. 트랜잭션의 시작이란
기본값인 자동 커밋 설정을 수동 커밋 설정으로 변경하여, 작업 내용을 Commit 또는 Rollback을 할 수 있도록 하는 것이다.
즉, 수동 커밋 모드로 변경하는 것은 트랜잭션을 시작한다라고 표현한다.