[JDBC] 트랜잭션
▶트랜잭션이란?
-트랜잭션을 이름 그대로 번역하면 "거래" 라는 뜻
-하나의 거래를 수행하는 데 필요한 데이터베이스의 연산을 모아놓은 것
-테이터베이스에서 하나의 거래를 안전하게 처리하도록 보장해주는 것
-데이터베이스에서 논리적인 작업의 단위
▶트랜잭션의 필요성
-데이터베이스는 다수의 사용자가 동시에 사용하더라도 항상 모순이 없는 정확한 데이터를 유지해야함
-그리고 데이터베이스에 장애가 발생하더라도 빠른 시간 내에 원래의 상태로 복구할 수 있어야 함
-데이터베이스 관리 시스템은 데이터베이스가 항상 정확하고 일관된 상태를 유지할 수 있도록 다양한 기능을 제공하는데, 그 중심에는 트랜잭션이 있음
-트랜잭션을 관리함으로써 데이터베이스의 회복과 병행 제어가 가능해져, 결과적으로 데이터베이스가 일관된 상태를 유지할 수 있게 됨
▶트랜잭션 예시(계좌이체)
-예를 들어 인터넷뱅킹을 통해 계좌이체 작업을 완벽하게 수행하려면 2개의 데이터베이스 연산(작업)이 필요하다.
-만약 A가 B에게 5000원을 입금해야하는 상황이라면, 다음과 같이 계좌이체라는 트랜잭션은 2가지 작업이 합쳐져서 하나의 작업처럼 동작해야 한다.
● 계좌이체를 트랜잭션을 위한 2가지 작업
- A의 잔고를 5000원 감소
- B의 잔고를 5000원 증가
-트랜잭션이 적용되지 않았을때, 만약 1번 연산은 성공했지만 2번 연산에서 시스템에 문제가 발생하면 계좌이체는 실패하고, A의 잔고만 5000원 감소하는 심각한 문제가 발생한다.
-데이터베이스가 제공하는 트랜잭션 기능을 사용하면 1번과 2번 연산 둘다 함께 성공해야 저장하고, 중간에 하나라도 실패하면 거래 전의 상태로 돌아갈 수 있다.
- 트랜잭션이 적용되었을때, 만약 1번 연산은 성공했는데 2번에서 시스템에 문제가 발생하면 계좌이체를 실패하고, 거래 전의 상태로 완전히 돌아갈 수 있다. 결과적으로 A의 잔고가 감소하지 않는다.
-모든 작업이 성공해서 데이터베이스에 정상적으로 반영하는 것을(Commit)이라 하고, 작업 중 하나라도 실패해서 거래 이전으르 되돌리는 것을 롤백(Rollback)이라 한다.
▶트랜잭션 특성, ACID
-트랜잭션이 성공적으로 처리되어 데이터베이스의 무결성과 일관성이 보장되려면 다음 4가지 특성을 꼭 보장해야 함.
- 원자성(Atomicity):트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 실패야하 함
- 일관성(Consistency):모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 함. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 함
- 격리성(Isolation) :동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 함. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 함. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolation level)을 선택할 수 있음.
- 지속성(Durability) :트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 함. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서, 성공한 트랜잭션 내용을 복구해야 함
▷트랙잭션 격리 수준 - Isolation level
-트랜잭션은 원자성, 일관성, 지속성을 보장한다. 하지만 문제는 격리성이다.
-트랜잭션 간의 격리성을 완벽히 보장하려면 트랜잭션을 거의 순서대로 실행해야 한다.
-이렇게 하면 동시 처리 성능이 매우 나쁘진다. 이러한 문제로 인해 ANSI 표준은 트랜잭션의 격리 수준을 다음 4단계로 정의했다.
- READ UNCOMMITED(커밋되지 않은 읽기)
- READ COMMITED(커밋된 읽기)
- REPEATABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 읽기)
▶데이터베이스 연결 구조와 DB 세션
-트랜잭션을 더 자세히 이해하기 위해 데이터베이스 서버 연결 구조와 DB 세션에 대한 개념이 필요함
▷데이터베이스 연결 구조1
- 사용자는 웹 애플리케이션 서버(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할 수 있음. 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게 됨.
-이때 데이터베이스 서버는 내부에 세션이라는 것을 만듦. 그리고 앞으로 해당 커넥션을 통안 모든 요청은 이 세션을 통해서 실행하게 됨
-쉽게 이야이해서 개발자가 클라이언트를 통해 SQL을 전달하면, 현재 커넥션에 연결된 세션이 SQL을 실행함
-세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료함. 그리고 이후에 새로운 트랜잭션을 다시 시작할 수 있음
-사용자가 커넥션을 닫거나, 또는 DBA(DB 관리자)가 세션을 강제로 종료하면 세션은 종료하게 됨
▷데이터베이스 연결 구조2
-커넥션 풀이 10개의 커넥션을 생성하면, 세션도 10개 만들어짐