Transaction(트랜잭션)개념과 접근방식
프로그래밍에서
아주 기본적이고 중요한
트랜잭션에 대해 정리를 해보려고 한다.
이번 포스팅에서 트랜잭션의 개념과
트랜잭션 접근방식에 대해 정리를 해보려고 한다 !
이 개념을 잘 알아야
나중에 개발할때도, 도움이 되며
트랜잭션 오류를 마주하였을 때에도
해결하기 더 쉬울거라고 생각한다 :-)
생각보다 트랜잭션 관련 오류가 많이 발생한다
트랜잭션은 데이터베이스 관리 시스템(DBMS)에서 데이터를 안전하게 처리하기 위한 개념이다.
트랜잭션이란?
데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다.
데이터베이스의 상태를 변경하는
하나 이상의 쿼리를
하나의 논리적 단위로 묶어서 작업을 수행한다.
트랜잭션내에 수행하는 작업이 모두 성공적으로 완료되면,
해당 작업들을 데이터베이스에 영구적인 반영을 한다.
만약 작업 중 하나라도 실패하면
이전에 수행된 모든 작업을 취소하고 데이터베이스를 이전 상태로 되돌려준다.
예를들어,
A -> B -> C 를 처리하는 로직이 있다고 가정하면
A는 오류 없이 실행을 완료하였고 B를 실행하는 도중에 오류가 발생한다면
A,B 작업 모두가 롤백(roll-back) 처리가 된다.
A부터 C까지 정상적으로 실행을 완료하면
해당 작업에 대해서 커밋(commit) 처리가 된다.
트랜잭션의 Commit 과 Rollback
Commit 이란?
하나의 트랜잭션이 성공적으로 끝나서 데이터베이스가 일관성있는 상태에 있음을 의미한다.
Rollback 이란?
트랜잭션의 원자성이 깨질 때,
즉 하나의 트랜잭션 처리가 비정상적으로 종료 되었을 때의 상태를 뜻한다.
Rollback 이 이뤄진다면 트랜잭션을 다시 실행하거나 부분적으로 변경된 결과를 취소할 수 있다.
트랜잭션에서 아주 아주 중요한 개념이기 때문에,
꼭- 꼭- 알고있어야 한다.
SQLD 시험을 볼 생각이 있다면
SQLD에서도 중요하게 다루는 개념이다
ACID 속성
트랜잭션은 아래와 같이 ACID 속성을 따르고 있다.
- 원자성 (Atomicity)
- 트랜잭션내 모든 작업이 성공적으로 수행되거나 아무런 변경도 발생하지 않은 상태여야 한다.
- 일관성 (Consistency)
- 트랜잭션이 실행되기 전과 후에도 데이터베이스의 상태가 일관성이 있어야 한다.
- 격리성 (Isolation)
- 여러 개의 트랜잭션이 동시에 실행될 때 각각의 트랜잭션은 다른 트랜잭션에 영향을 주지 않도록 격리되어야 한다. 하나의 트랜잭션이 완료되기 전까지 다른 트랜잭션은 해당 작업에 대한 변경 사항을 알 수 없어야 한다.
- 지속성 (Durability)
- 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 합니다. 중간에 시스템에 문제가 발생하더라도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
트랜잭션 개념에 대해서 알아보았으니,
트랜잭션에서 중요한 접근방식에 대해서 알아보자
트랜잭션 접근 방식이란?
트랜잭션 접근 방식은 트랜잭션을 어떻게 다루고 조작하는지를 나타내는 개념이다.
트랜잭션 접근 방식에는 두 가지 주요한 방식이 있는데
프로그래밍적 트랜잭션(명시적 트랜잭션)과 선언적 트랜잭션이다.
프로그래밍적 트랜잭션 (Programmatic Transaction)
개발자가 명시적으로 트랜잭션을 시작하여, 커밋 또는 롤백하는 코드를 작성하여 트랜잭션을 직접 관리하는 방식이다.
- 개발자가 직접 코드로 트랜잭션을 제어하는 방식이다.
- 트랜잭션의 시작, 커밋, 롤백을 개발자가 명시적으로 작성해야한다.
- 트랜잭션 API 또는 트랜잭션 관리 객체를 사용하여 트랜잭션의 시작과 종료를 직접 제어한다.
- 트랜잭션의 범위와 수명을 개발자가 직접 제어할 수 있으므로 유연하고 세밀한 트랜잭션 로직을 구현할 수 있다.
- 스프링 프레임워크에서 제공하는 TransactionTemplate 또는 PlatformTransactionManager를 사용하여 트랜잭션을 관리 할 수 있다.TransactionTemplate은 TransactionCallback을 통해 트랜잭션 경계 내에서 실행할 코드를 지정하고, PlatformTransactionManager를 사용하여 트랜잭션을 관리한다. PlatformTransactionManager는 트랜잭션의 시작, 커밋, 롤백 등을 처리한다.
- 트랜잭션 관리 코드가 번거로울 수 있고, 코드 중복이 발생할 수 있다.
선언적 트랜잭션 (Declarative Transaction)
트랜잭션을 선언적으로 정의하고, 프레임워크나 컨테이너가 해당 정의에 따라 트랜잭션을 자동으로 관리하는 방식이다.
- 트랜잭션을 선언적으로 정의하고, 프레임워크가 해당 정의에 따라 자동으로 트랜잭션을 관리하는 방식이다.
- 개발자는 트랜잭션을 명시적으로 다루지 않아도되고, 트랜잭션 시작과 종료를 프레임워크가 자동으로 처리해준다.
- 트랜잭션 로직을 분리하여 코드의 가독성과 유지보수성을 높일 수 있다.
- 주로 애노테이션 기반의 트랜잭션 설정이나 XML기반의 트랜잭션을 설정을 사용한다.
- 스프링에서 제공하는 @Transactional 어노테이션을 사용하여 메서드 또는 클래스레벨에 트랜잭션을 선언하여 사용 할 수 있다.
- 트랜잭션의 세부적인 제어가 필요한 경우에는 제한적일 수 있다.
각각의 방식은 트랜잭션 관리의 목적과 요구사항에 따라 선택하여 사용하면 된다.
프로그래밍적 트랜잭션은 특정한 로직이나 비즈니스 요구사항에 따라 트랜잭션을 직접 제어해야 할 때 유용하며,
선언적 트랜잭션은 일반적인 트랜잭션 관리를 간편하게 처리 할 때 유용하다.
아주 기본적이고, 필수적인 내용이니까
꼭- 이해하고 숙지합시다
백엔드 면접 단골 질문이기도 합니다
😎
'DB' 카테고리의 다른 글
[ERD] 이클립스 ER Master 사용법 그리고 ERD 추출, JAVA DOC 추출시 인코딩 에러 해결 (1) | 2024.07.11 |
---|---|
[DB/SQL] 뷰(View) 그리고 프로시저(Procedure) 개념 (3) | 2024.02.29 |
[DB] 스프링부트 트랜잭션 @Transactional (2) | 2024.02.21 |
[SQL] MySql에서 함수를 사용하는것과 사용하지 않는것에 대한 속도 차이 (4) | 2024.01.07 |
[DB] DBeaver(디비버)로 Tibero(티베로) 연결하기 (2) | 2023.12.11 |