
1. 트랜잭션 - 개념 이해
1-1. 트랜잭션 ACID
원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다.
일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준 (Isolation level)을 선택할 수 있다.
지속성(Durability): 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
1-2. 트랜잭션 격리 수준 - Isolation level
- READ UNCOMMITED(커밋되지 않은 읽기)
- READ COMMITTED(커밋된 읽기)
- REPEATABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 가능)
- 이후에 기회가 되면 각각에 대한 디테일 추가.
2. 데이터베이스 연결 구조와 DB 세션
-
연결 구조
- 클라이언트(WAS, DB 접근 툴)를 사용해서 데이터베이스 서버에 접근 -> 커넥션
- 데이터베이스 서버는 내부에 세션 생성 -> 커넥션을 통한 모든 요청은 세션에서 실행
- 세션은 트랜젝션 시작하고, 컷밋/롤백을 통해 트랜젝션을 종료함.
-
사용자 1명

-
사용자 n명
- 세션도 n개가 만들어짐.

3.트랜잭션 - DB 예제(개념 이해)
- 트랜잭션 사용법
- 데이터 변경 쿼리를 실행하고 데이터베이스에 그 결과를 반영하려면 commit 호출, 결과를 반영하고 싶지 않으면 rollback 호출.
- commit 호출 전까지는 데이터를 임시 저장. -> 즉 트랜잭션을 시작한 세션에만 반영되고 다른 세션에는 반영되지 않음.
4.트랜잭션 - DB 예제(자동 커밋, 수동 커밋)
자동 커밋: 각각의 쿼리 실행 직후에 자동으로 커밋을 호출
- 커밋이나 롤백을 직접 호출하지 않아도 되서 편리
- 쿼리를 실행할 때마다 자동으로 커밋이 되어 트랜잭션 기능을 제대로 사용할 수 없음.
set autocommit true;
수동 커밋
- 반드시 쿼리 이후 commit 혹은 rollback해야함.
set autocommit false;
5. DB 락 - 개념 이해
원자성(Atomicity)과 관련이 있음.
- 세션1이 트랜잭션을 시작하고 데이터를 수정하고 커밋을 수행 전, 세션2에서 같은 데이터를 수정하면 문제가 발생
- 이런 문제로 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안 커밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야함.
5-1. 락 진행 예제

- 동시에 2개의 세션에서 값을 변경하고자 함.
- 동시에 걸락을 걸어준다.

- 세션1 트랜잭션 시작
- 세션1 값 변경 시도(세션1의 요청이 빠르다고 가정)
- 세션 1은 락 획득 -> update 수행

- 세션2 트랜젝션 시작
- 락이 없으므로 락이 돌아올 때까지 대기 -> 무제한x 타임아웃 존재




6. DB 락 - 조회
- 일반적인 조회는 락을 사용하지 x
- 트랜잭션 종료 시점까지 해당 데이터를 다른 곳에서 변경하지 못하도록 강제로 막아야 할 때 사용
select for update 사용
7. 트랜잭션 - 적용

- 트랜잭션은 비즈니스 로직이 있는 서비스 계층에서 시작. 비즈니스 로직이 잘못되면 해당 비즈니스 로직으로 인해 문제가 되는 부분을 함께 롤백해야 하기 때문/
- 그런데 트랜잭션을 시작하려면 커넥션이 필요. -> 서비스 계층에서 커넥션을 만들고, 트랜잭션 커밋 이후에 커넥션을 종료해야 한다.
- 애플리케이션에서 DB 트랜잭션을 사용하려면 트랜잭션을 사용하는 동안 같은 커넥션을 유지.
8. 참조
- 스프링 DB 1편 - 데이터 접근 핵심 원리
- 링크