트랜잭션(Transaction)이란?
트랜잭션은 "더 이상 나눌 수 없는 작업의 단위"를 의미한다. 데이터베이스에서 여러 작업을 하나로 묶어 처리할 때 사용되며, 트랜잭션이 성공하면 모든 작업이 적용되고, 실패하면 아예 적용되지 않도록 하여 데이터를 안전하게 처리할 수 있다.
트랜잭션의 속성
트랜잭션은 ACID라는 네 가지 중요한 속성을 가진다.
- 원자성 (Atomicity): 트랜잭션 내의 모든 작업은 하나의 단위로 실행되며, 하나라도 실패하면 전체 작업이 취소(rollback)되어 데이터에 아무 영향도 없게 된다.
- 일관성 (Consistency): 트랜잭션이 끝난 후 데이터는 항상 일관성을 유지해야 한다. 데이터베이스의 규칙을 어기지 않도록 보장하는 것이다.
- 격리성 (Isolation): 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않도록 각 트랜잭션은 독립적으로 실행된다.
- 지속성 (Durability): 트랜잭션이 성공하면 그 변경 사항은 영구적으로 데이터베이스에 반영된다. 시스템이 갑자기 중단되더라도 데이터는 안전하게 유지된다.
계좌이체 예시
트랜잭션의 개념을 이해하기 쉽게 계좌 이체 예시로 설명하겠다. 예를 들어, 부모님이 생활비를 A에게 송금한다고 가정하자. 이 과정에서 두 가지 작업이 일어난다:
- 부모님의 계좌에서 돈이 인출된다.
- A의 계좌에 돈이 입금된다.
이 두 과정은 반드시 함께 성공하거나, 둘 다 실패해야 한다. 만약 인출은 성공했지만 입금이 실패하면 큰 문제가 발생할 수 있다. 그래서 이 두 작업을 하나의 트랜잭션으로 묶어 동시에 성공하거나 실패하게 만들어야 한다.
START TRANSACTION;
-- 부모님의 계좌에서 인출
UPDATE account SET balance = balance - 100 WHERE id = 'parent';
-- A의 계좌에 입금
UPDATE account SET balance = balance + 100 WHERE id = 'A';
COMMIT;
MySQL에서 트랜잭션 사용하기
MySQL에서는 트랜잭션을 사용하여 여러 작업을 하나의 단위로 묶어 처리할 수 있다. 기본적으로 MySQL은 명령어를 실행할 때마다 자동으로 저장(Commit)하지만, 트랜잭션을 사용하면 여러 작업을 한꺼번에 적용하거나 취소할 수 있다.
트랜잭션을 사용하여 작업을 처리하는 방법을 간단한 예시로 설명해 보겠다.
MySQL 트랜잭션 예시
다음과 같이 guest_book 테이블이 있다.
START TRANSACTION;
select * from guest_book;
INSERT INTO guest_book VALUES ('2024-08-30 20:30:17.514419', 2, '2024-08-30 20:30:17.514419', "들렸다 갑니다.", "하이하이");
COMMIT;
트랜잭션을 시작하고 데이터를 삽입한 후, COMMIT을 사용하여 데이터베이스에 변경 내용을 저장하는 예시다.
COMMIT을 실행하면, 삽입한 데이터가 데이터베이스에 영구적으로 저장된다.
이번에는 ROLLBACK을 사용한 예시다. 트랜잭션을 시작한 후 데이터를 삽입하지만, ROLLBACK을 통해 이전 상태로 되돌린다.
START TRANSACTION;
select * from guest_book;
INSERT INTO guest_book VALUES ('2024-08-30 20:30:17.514419', 3, '2024-08-30 20:30:17.514419', "들렸다 갑니다11.", "하이하이11");
ROLLBACK;
ROLLBACK을 실행하면 트랜잭션 내의 모든 작업이 취소되고, guest_book 테이블에는 데이터가 추가되지 않는다. 즉, 트랜잭션 시작 이전의 상태로 되돌아가는 것이다.
결론
트랜잭션을 사용하면 여러 작업이 중간에 실패했을 때 데이터를 원래 상태로 복구할 수 있다. 예를 들어, 여러 테이블에 데이터를 입력하는 도중 오류가 발생하면, 오류 전까지 진행된 모든 작업을 취소하고 처음 상태로 되돌리는 것이다.
이러한 방식으로 트랜잭션은 데이터의 무결성을 지키고, 데이터베이스의 신뢰성을 높이는 데 중요한 역할을 한다.
'WEB' 카테고리의 다른 글
Spring Data JPA로 된 코드를 JDBC로 다시 짜보기 (1) | 2024.09.25 |
---|---|
MDC를 이용한 로깅 도입기 (0) | 2024.09.23 |
@SpringBootTest vs @Mock (0) | 2024.09.12 |
스프링부트의 Tomcat과 Thread Pool (0) | 2024.09.10 |
JUnit을 사용해서 Java 단위 테스트 하기 (0) | 2024.09.02 |
RDB와 NoSQL의 차이점 (3) | 2024.09.01 |
영속성 컨텍스트란? (1) | 2024.08.31 |
Java Thread란 무엇일까? (1) | 2024.08.30 |