트랜잭션 이해
트랜잭션은 거래라는 뜻인데, 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 의미한다.
예를 들어 A가 B에서 5000원을 계좌이체한다면,
1. A의 잔고를 5000원 감소
2. B의 잔고를 5000원 증가
위의 2가지 작업이 연속으로 동작해야 한다.
만약, 1번은 성공하고 2번에서 시스템 문제가 발생한다면 계좌이체를 실패하고 A만 5000원을 잃게 되는 문제가 발생한다.
데이터베이스의 트랜잭션 기능을 사용하면 중간에 하나라도 실패하면 거래전의 상태로 돌아갈 수 있다. (모두 성공해야 저장되므로 2번에서 시스템 문제가 발생해도 A의 잔고가 감소하지 않는다!)
특징
트랜잭션은 비즈니스 로직이 있는 서비스 계층에서 시작해야 한다.
비즈니스 로직이 잘못되면 해당 비지니스 로직으로 인해 문제가 되는 부분을 함께 rollback해야하기 때문!
근데 트랜잭션을 시작하려면 Connection이 필요하다.
→ 서비스 계층에서 Connection을 만들고, 트랜잭션 commit 이후에 Connection을 종료한다.
Commit : 모든 작업이 성공해서 데이터베이스에 정상 반영되는 것
Rollback : 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것 (이전 Commit된 부분으로 되돌린다.
자동 커밋, 수동 커밋
자동커밋으로 설정하면 각각의 쿼리 실행 직후에 자동으로 커밋을 호출한다. → 커밋이나 롤백을 직접 호출하지 않아도 됨
편리하지만, 쿼리를 실행할 때마다 자동으로 커밋이 되머버리기 때문에 트랜잭션 기능을 제대로 사용할 수 없다.
* 수동 커밋 설정을 하면 이후에 꼭 commit, rollback을 호출해야 한다 !!!
* 수동 커밋 모드나 자동 커밋 모드를 한번 설정하면 해당 세션에서는 유지된다. (중간에 변경하는 것 가능)
자동커밋 모드
set autocommit true;
수동커밋 모드
set autocommit false;
트랜잭션 ACID
- 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다.
- 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
- 격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolation level)을 선택할 수 있다.
- 지속성(Durability): 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
트랜잭션은 원자성, 일관성, 지속성을 보장한다.
그러나 트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 순서대로 실행해야 한다. → 동시 처리 성능이 매우 나빠진다.
이런 문제로 인해 ANSI 표준은 트랜 잭션의 격리 수준을 4단계로 나누어 정의했다.
트랜잭션 격리 수준 - Isolation level
- READ UNCOMMITED(커밋되지 않은 읽기)
- READ COMMITTED(커밋된 읽기)
- REPEATABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 가능)
* 단계가 높아질수록 데이터베이스 성능이 느려진다.
* 보통 READ COMMITTED(커밋된 읽기), REPEATABLE READ(반복 가능한 읽기)을 사용
DB 세션

사용자는 웹 애플리케이션 서버(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근한다.
클라이언트는 DB 서버에 연결 요청하고 커넥션을 맺는데, 이 때 DB 서버는 내부에 세션이라는 것을 생성한다.
그리고 이 세션을 통해서 해당 커넥션으로 들어오는 모든 요청을 실행한다.
→ 클라이언트를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 실행한다.
- 세션은 트랜잭션을 시작하고, commit 또는 rollback을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을 다시 시작한다.
- 사용자가 커넥션을 닫거나, 또는 DB 관리자(DBA)가 세션을 강제로 종료하면 세션은 종료된다.
- 만약, Connection Pool이 10개의 커넥션을 생성하면 세션도 10개가 생성된다.
커넥션과 세션
애플리케이션에서 DB 트랜잭션을 사용하려면 트랜잭션을 사용하는 동안 같은 Connection을 유지해야한다.
왜? 그래야 같은 세션을 사용하니깐!
그렇다면 같은 커넥션을 유지하려면 어떻게 해야할까?
→ 커넥션을 파라미터로 전달해서 같은 커넥션이 사용되도록 유지하자 !
참고 링크
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Tech > DB | RDBMS' 카테고리의 다른 글
[Django][DataBase] 프로젝트 DB 구성하기 (0) | 2024.04.04 |
---|---|
[DB] DB 락(DB Lock)을 아주 쉽게 알아보자. (0) | 2024.03.10 |
[DB] 커넥션 풀 (Connection Pool) 이해하기 (Connection 획득 과정/DataSource 이해) (0) | 2024.03.06 |
[JDBC] JDBC 쉽게 이해하기 (JDBC/JDBC 드라이버/SQL Mapper/ORM) (0) | 2024.03.05 |
[MySQL] USER 생성, 권한 부여 (0) | 2024.02.13 |
댓글