-
트랜잭션스프링/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 2. 7. 20:32
트랜잭션 - 개념 이해
데이터를 저장할 때 단순히 파일을 저장해도 되는데, 데이터베이스에 저장하는 이유는 무엇일까?
여러가지 이유가 있지만, 가장 대표적인 이유는 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다.
트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다.
이것을 쉽게 풀어서 이야기하면, 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록
보장해주는 것을 뜻한다.
그런데 하나의 거래를 안전하게 처리하려면 생각보다 고려해야 할 점이 많다.
예를 들어서 A의 5000원을 B에게 계좌이체한다고 생각해보자.
A의 잔고를 5000원 감소하고, 잔고를 5000원 증가해야 한다.
계좌이체는 A의 잔고 감소와 B의 잔고 증가가 하나의 작업처럼 동시에 일어나야 한다.
잔고 감소까지는 성공했는데 잔고 증가에서 오류가 발생할 경우에는 5000원이 감소하기만 하지만.
데이터베이스가 제공하는 트랜잭션 기능을 사용하면 둘다 성공해야 저장하고, 중간에 실패할 경우에는 거래전의 상태로 되돌릴 수 있다.
모든 작업이 성공했을 때 데이터베이스에 정상 반영하는 것을 커밋(Commit)이라 하고,
작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백(Rollback)이라 한다.
트랜잭션은 ACID라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속정(Durability)을 보장해야한다.
- 원자성 : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것 처럼 모두 성공하거나 모두 실패해야한다.
- 일관성 : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
- 격리성 : 동시에 실행되는 트랜잭션들이 서로 영향을 끼치지 못하도록 격리한다. 예를 들어 동시에 같은 데이터를 수정못하게 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준을 선택할 수 있다.
- 지속성 : 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
트랜잭션은 원자성,일관성,지속성은 보장되는데 문제는 격리성이다.
트랜잭션간의 격리성이 유지되려면, 트랜잭션을 순서대로 실행해야 한다.
이렇게 하면 동시 처리 기능 성능이 매우 나빠진다.
이런 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 4단계 나누어 정의했다.
트랜잭션 격리 수준- Isolation level
- READ UNCOMMITED(커밋되지 않은 읽기)
- READ COMMITED(커밋된 읽기)
- REPEATABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 가능)
데이터베이스 연결 구조와 DB 세션
트랜잭션을 더 자세히 이해하기 위해 데이터베이스 서버 연결 구조와 DB 세션에 대해 알아보자.
- 사용자는 웹 애플리케이션(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할 수 있다.
클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게된다.
이때 데이터베이스 서버는 내부에 세션이라는 것을 만든다. 그리고 앞으로 해당 커넥션을 통한 모든 요청은 이 세션을 통해서 실행하게 된다. - 쉽게 이야기해서 개발자가 클라이언트를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 SQL을 실행한다.
- 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을
다시 시작할 수 있다 - 사용자가 커넥션을 닫거나, 또는 DBA(DB 관리자)가 세션을 강제로 종료하면 세션은 종료된다.
- 커넥션 풀이 10개의 커넥션을 생성하면, 세션 10개 만들어 진다.
'스프링 > 스프링 DB 1편 - 데이터 접근 핵심 원리' 카테고리의 다른 글
스프링과 문제 해결 - 예외 처리, 반복 (0) 2024.02.12 자바 예외 이해 (1) 2024.02.09 스프링과 문제 해결 - 트랜잭션 (0) 2024.02.08 커넥션풀과 데이터소스 이해 (0) 2024.02.06 JDBC 이해 (0) 2024.02.06