트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
트랜잭션은 ACID라는 특징을 갖는다.
원자성은 트랜잭션에 포함된 SQL은 모두 성공하거나 모두 실패해야 한다는 것이다.
같은 트랜잭션에 포함된 명령 중 하나라도 실패하면 이전까지의 변경점은 모두 취소되고 트랜잭션 수행 전의 상태로 돌아가야 한다.
하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.
다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻이다.
여러 트랜잭션이 병렬으로 실행될 때 하나의 트랜잭션 수행중에 다른 트랜잭션이 끼어들 수 없다.
트랜잭션의 결과가 데이터베이스에 영구히 저장되어야 한다. (시스템에 문제가 발생하더라도)
트랜잭션이 성공하면 commit 연산을 통해 데이터베이스의 해당 결과를 모두 적용한다. 만약 락을 사용하고 있었다면 해당 락을 다음 트랜잭션에게 넘겨준다.
트랜잭션이 실패하면 rollback 연산을 통해 현재까지 실행된 모든 쿼리를 이전 상태(직전 커밋)로 되돌린다.
트랜잭션이 롤백될 때 세이브 포인트를 지정하여 해당 지점까지만 롤백 되도록 지정할 수 있다.
트랜잭션이 작업을 시작하여 실행중인 상태
트랜잭션에 문제가 발생하여 실행이 중단된 상태
트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태
트랜잭션이 성공적으로 모든 명령을 완료한 상태
트랜잭션의 결과를 DB에 반영하기 위해 커밋 연산을 수행한 상태
위에서 설명한 ACID는 데이터베이스에서 엄격하게 지켜지지 않을 수 있다. 왜냐하면 ACID를 엄격하게 지키면 동시성이 저하되어 성능이 떨어지기 때문이다.
우리는 개발하는 프로젝트가 필요한 Isolation Level을 적절하게 선택하여 동시성과 안정성 사이에서 적절한 트레이드 오프를 해야한다.
다음글에서 Isolation Level과 Lock에 대해 알아보자!