본문 바로가기
공부

트랜잭션

by son_i 2023. 12. 13.
728x90

트랜잭션이란 ?

트랜잭션은 쪼갤 수 없는 작업의 단위로 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야 할 일련의 연산들을 의미.

 

여기서 작업의 단위는 질의어 한문장이 아니다 !

   작업 단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것

 

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