트랜잭션이란 ?
트랜잭션은 쪼갤 수 없는 작업의 단위로 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야 할 일련의 연산들을 의미.
여기서 작업의 단위는 질의어 한문장이 아니다 !
작업 단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것
ex) 사용자 A가 사용자 B에게 송금시
1. A의 계좌에서 금액 차감 : update로 A의 잔고 변경
2. B의 계죄에 금액 추가 : update로 B의 잔고 변경
작업 단위 : 출금 update + 입금 update를 통틀어 하나의 트랜잭션 이라고 함.
=>> 두 쿼리문이 모두 성공적으로 완료되어야만 하나의 작업 완료
트랜잭션의 특징
ACID 트랜잭션의 특징 4가지는 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability)이다.
- 원자성 : do or not. 트랜잭션이 데이터베이스에 모두 반영되거나, 반영되지 않는 것.
트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두 완벽히 수행되지 않고 어느 하나에 오류 발생시 트랜잭션 전부가 취소 되어야함.
- 일관성 : 트랜잭션 작업처리 결과가 항상 같아야한다.
트랜잭션이 진행되는 동안 DB가 변경되더라도 업데이트된 DB로 트랜잭션이 진행되는 것이 아니라, 처음 트랜잭션을 진행하기 위해 참조한 DB로 진행된다.
- 독립성 : 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이 다른 트랜잭션의 연산에 끼어들 수 수 없다. 하나의 트랜잭션이 완료될 때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.
- 지속성 : 트랜잭션이 성공적으로 완료된 경우 결과는 영구적으로 반영되어야 한다.
트랜잭션의 Commit, Rollback 연산
Commit 연산
- Commit 연산은 한 개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다.
Rollback 연산
- Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산이다.
- Rollback 시에는 해당 트랜잭션을 재시작하거나 폐기한다.
트랜잭션 사용시 주의점
트랜잭션은 꼭 필요한 최소한의 부분에 적용하는 것이 좋다.
여러 개의 트랜잭션으로 쪼개서 트랜잭션의 범위를 최소화하라는 의미.
Y? ) DB의 커넥션 개수가 제한적이기 때문에 각 단위 프로그램이 커넥션을 소유하는 시간이 길어지면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다. 이 경우 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있다.
스프링부트에서 @Transactional 의 사용
- @Transactional은 트랜잭션에 대한 전파, 격리, 시간 초과, 읽기 전용 및 롤백 조건을 설정할 수 있고, 트랜잭션 관리자를 지정할 수도 있다.
- 사용법 : 클래스나 메소드에 선언
- 적용 우선 순위
클래스의 메소드 > 클래스 > 인터페이스의 메소드 > 인터페이스
- 옵션
@Transactional(readOnly = true) : 트랜잭션이 읽기 전용인 경우 설정하여 런타임시 최적화가 가능.
@Transactional(readOnly = true, timeout = 10) : 시간제한을 초단위로 설정
@Transactional(isolation = Isolation.READ_UNCOMMITTED) : 격리수준 설정
READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE 등의 옵션이 있음.
@Transactional(propagation = Propagation.REQUIRED) : 전파 설정
이건 아직 뭔지 잘 모르겠군
나는 더티체킹을 할 때 메소드에 @Transactional을 사용했었다.
어노테이션을 달아주면 메소드가 실행될 때 프록시 객체가 생성되고 이 프록시 객체가 트랜잭션을 실행해서 commit or rollback을 수행한다.
'공부' 카테고리의 다른 글
data.sql 실행 안 될 때 (0) | 2023.12.15 |
---|---|
동시성(Concurrency) 이슈 (0) | 2023.12.13 |
Page로 페이지 처리하기 (0) | 2023.12.10 |
Elasticsearch) Mapping (1) | 2023.12.08 |
Elasticsearch) 데이터 색인과 텍스트 분석 (1) | 2023.12.08 |