Transactional


Transaction

트랜잭션은 이름 그대로 번역하면 거래라는 뜻이다.

쉽게 이야기하면 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록

보장해주는 것을 뜻한다. 예를 들면 A의 5000원을 B에게 계좌이체한다고 생각해보자.

A의 잔고를 5000원 감소하고, B의 잔고를 5000원 증가해야 한다.


5000원 계좌 이체

  • A의 잔고를 5000원 감소
  • B의 잔고를 5000원 증가


계좌이체라는 거래는 이렇게 2가지 직업이 합쳐져서 하나의 작업처럼 동작해야 한다.

만약 1번은 성공했는데 2번에서 시스템에 문제가 발생하면 1,2 둘다 함께 성공해야 저장하고,

중간에 하나라도 실패하면 거래 전의 상태로 돌아갈 수 있다. 만약 1번은 성공했는데 시스템에

문제가 발생하면 계좌이체는 실패하고, 걸래 전의 상태로 완전히 돌아갈 수 있다.

결과적으로 A의 잔고가 감속하지 않는다. 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을

commit이라고 하고, 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 Rollback이라고 한다.


트랜잭션 격리 수준 (Isolation level)

⒈ READ UNCOMMITTED (커밋되지 않은 읽기)

⒉ READ COMMITTED (커밋된 읽기)

⒊ REPEATABLE READ (반복 가능한 읽기)

⒋ SEIALIZABLE (직렬화 기능)


격리 수준은 단계가 높아지면 높아질 수록 성능은 떨어진다는 특징을 가지고 있다.

보통은 2,3 단계를 많이 쓴다고 한다.



트랜잭션 동작방법

데이터 변경 쿼리를 실행하고 데이터베이스에 그 결과를 반영하려면 커밋 명령어인

commit 을 호출하고, 결과를 반영하고 싶지 않으면 롤백 명령어인 rollback

호출하면 된다. commit을 호출하기 전까지는 임시로 데이터를 저장하는 것이다.

따라서 해당 트랜잿견을 시작한 세션에게만 변경 데이터가 보이고 다른 세션에게는

변경 데이터가 보인지 않는다.


커밋하지 않은 데이터를 다른 곳에서 조회할 수 있으면 어떤 문제가 발생할까?

예를 들어서 커밋하지 않은 데이터가 보인다면, 다른 세션에서 데이터를 조회했을 때

임시저장된 데이터가 보일 것이다. 이렇게 되면 다른 세션에서는 데이터가 존재한다고

생각하고 어떠한 로직을 수행할 수 있다. 그런데 이떼 세션1에서 롤백을 수행한다고 하면,

임시저장된 데이터가 사라지게 되고, 다른 세션에서는 오류가 발생할 것이다.

결과적으로 데이터 정합성에 큰 문제가 발생한다.



자동 커밋, 수동 커밋


1. 자동 커밋

자동커밋은 default값이다.

set autocommit true;

자동 커밋으로 설정하면 각각의 쿼리 실행 직후에 자동으로 커밋을 호출한다.

따라서 커밋이나 롤백을 직접 호출하지 않아도 되는 편리함이 있다.

하지만 쿼리를 하나하나 실행할 때 마다 자동으로 커밋이 되어버리기 때문에

개발자가 원하는 트랜잭션 기능을 제대로 사용할 수 없다.

따라서 commit, rollback 을 직접 호출하면서 트랜잭션 기능을 제대로

수행하려면 자동 커밋을 끄고 스동 커밋을 사용해야 한다.


2. 수동 커밋

set autocommit false;

보통은 자동 커밋모드가 기본으로 설정된 경우가 많기 때문에,

수동 커밋 모드로 설정하는 것을 트랜재션을 시작 한다고 표현할 수 있다.

수동 커밋 설정을 하면 이후에 꼭 commit, rollback 을 호출해야 한다.