SQL
위 링크에 포함되어 있는 트랙잭션 개념에 추가학습한 내용
: 여러개의 작업들을 하나의 그룹으로 묶어 처리하는 하나의 단위로 애플리케이션에서 사용하는 데이터의 무결성을 보장하는 핵심적인 역할을 한다.
🧐 데이터의 무결성
위키백과-데이터의 무결성
데이터의 정확성과 일관성을 유지하고 보증하는 것
: 트랜잭션의 특징은 ACID 원칙을 따른다. 각각 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 의미한다.
: 트랜잭션 내의 작업들을 어떤 작업은 처리하고 어떤 작업은 처리하지 않는 식으로 더이상 쪼갤 수 없음을 의미하며, 하나의 트랜잭션은 하나의 작업으로 인식해 모두 성공하거나, 모두 실패하는가의 결과 중에 하나로만 처리되는 것이 보장되어야 한다.
하나의 작업, 하나의 결과
: 트랜잭션이 에러없이 성공적으로 종료될 경우, 비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되는 것을 말한다.
주문 - 처리 - 업데이트
의 과정에서 처리-업데이트
부분에 에러가 발생해 실 수량에 맞게 스탬프 수가 업데이트되지 못하는 경우가 없어야 한다는 말이다.: 여러개의 트랜잭션이 실행될 경우 각각 독립적으로 실행하며 서로에게 간섭하지 않는 것을 말한다.
: 트랜잭션이 완료되면 그에 따른 결과가 지속되어야 한다.
: 데이터베이스에서 사용되는 명렁어들을 말한다.
: 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어로 해당 명령어를 수행하면 하나의 트랜잭션 과정은 종료된다.
: 작업 중 문제가 발생했을 때, 트랜잭션 내에서 수행된 작업들을 취소하는 명령어로 트랜잭션 시작 전의 상태로 되돌아간다.
💡주의할 점
트랜잭션은 데이터베이스에만 한정적으로 사용하는 것이 아니다.
필요에 따라 전혀 다른 리소스를 하나의 작업 단위로 묶어서 사용할 수도 있다. (예를 들면 데이터베이스 저장과 동시에 클라이언트에게 처리완료 메세지를 보내는 경우) 항상 어떻게 여러개의 작업들을 하나의 트랜잭션으로 묶어 처리할 지 고민해야 한다.
: 트랜잭션에는 크게 로컬 트랜잭션
과 분산 트랜잭션
두가지로 구분할 수 있으며, Spring에서는 로컬 트랜잭션
중 선언형 과 프로그래밍 코드 베이스 방식을 사용한다.
☝️ @Transactional
클래스 레벨과 메서드 레벨에 함께 적용된 경우, 메서드 레벨의 애너테이션이 우선 적용된다.
: 메서드 레벨에서만 해당되는 애트리뷰트이다.
: 트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할 때 또는 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식을 말한다.
Propagation.REQUIRED
: default, 진행 중인 트랜잭션이 없으면 새로 시작하고, 진행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여한다.Propagation.REQUIRES_NEW
: 이미 진행중인 트랜잭션과 무관하게 새로운 트랜잭션이 시작된다. 기존에 진행중이던 트랜잭션은 새로 시작된 트랜잭션이 종료할 때까지 중지된다.Propagation.MANDATORY
: 진행 중인 트랜잭션이 없으면 예외를 발생시킨다.Propagation.NOT_SUPPORTED
: 트랜잭션을 필요로 하지 않는다. 진행 중인 트랜잭션이 있으면 메서드 실행이 종료된 때까지 진행중인 트랜잭션을 중지되며, 메서드 실행히 종료되면 트랜잭션을 계속 진행한다.Propagation.NEVER
: 트랙잭션을 필요로 하지 않는다. 진행 중인 트랜잭션이 존재할 경우에는 예외를 발생시킨다. : 트랜잭션의 ACID원칙에 맞게 격리성을 보장하기 위한 애트리뷰트
Isolation.DEFAULT
: 데이터베이스에서 제공하는 기본값Isolation.READ_UNCOMMITTED
: 다른 트랜잭션에서 커밋하지 않은 데이터를 읽는 것을 허용한다.Isolation.READ_COMMITTED
: 다른 트랜잭션에 의해 커밋된 데이터를 읽는 것을 허용한다.Isolation.REPEATABLE_READ
: 트랜잭션 내에서 한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 한다.Isolation.SERIALIZABLE
: 동일한 데이터에 대해서 동시에 두개 이상의 트랜잭션이 수행되지 못하도록 한다.☝️ 격리레벨은 일반적으로 데이터베이스나 데이터 소스에 설정된 격리레벨을 따르는 것을 권장히기 때문에 자주 사용되지 않는 애트리뷰트이다. 참고로만 알고 있을 것
💡작업별로 트랜잭션을 새로 생성해야 한다거나 특정 작업에는 트랜잭션을 적용하지 않는 등의 경우가 아니라면 애트리뷰트 없이 @Transactional 애너테이션만 추가해도 무방하다.
: @Transactional
애너테이션을 비즈니스 로직에 적용하지 않고, 트랜잭션을 적용하는 방법이다.
Config
클래스를 생성해 트랜잭션의 애트리뷰트 등을 설정하여 메서드 별로 트랜잭션을 사용할 수 있게 하는 방식