트랜잭션이란 데이터베이스의 상태를 변경시키기 위한 작업단위를 의미한다. 데이터베이스에서 데이터를 제대로 처리하는 과정을 트랜잭션이라고 하는데 계좌이체 예시를 들어 트랜잭션을 설명할 수 있다. 만약 A가 B에게 5000원을 계좌이체한다고 한다면 A의 통장 잔고에서는 5000원이 감소하고 B의 통장 잔고는 5000원 증가해야 한다. 이렇게 A의 통장 잔고가 감소하고 B의 통장 잔고가 증가하는 데이터 처리 과정을 트랜잭션이라고 한다.
데이터베이스에서 일어나는 트랜잭션은 원자성, 일관성, 격리성, 지속성의 특성을 가져야 한다.
원자성(Atomicity)
한 트랜잭션 내에서 실행한 여러 작업들은 하나의 작업인 것처럼 실행되어야 하는 것을 원자성이라고 한다.
일관성(Consistency)
모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다.
격리성(Isolation)
동시에 실행되는 여러 트랜잭션들은 서로 영향을 미치지 않도록 격리되어 실행되어야 한다.
지속성(Durability)
트랜잭션이 성공적으로 끝나면 그 결과가 항상 기록되어야하고 그 결과는 지속성을 가져야 한다.
클라이언트에서 DB에 연결을 요청해 커넥션을 맺게되면 DB 내부에서는 세션을 생성하는데 커넥션으로 들어오는 모든 요청은 세션을 통해 실행되게 된다.
세션에서는 트랜잭션을 시작하고 커밋(Commit)과 롤백(Rollback)을 통해 데이터를 처리하게된다. 커밋을 하면 작업한 결과가 데이터 베이스에 반영되며 롤백을 하면 작업한 결과를 실행하지 않고 이전 단계로 되돌리게 된다.
만약 커넥션 풀에서 미리 커넥션을 생성해서 사용할 수 있는데 만약 10개의 커넥션을 생성하면 세션도 동일하게 10개가 생성된다.
위에서 언급한 것처럼 데이터베이스에 커밋 또는 롤백을 하기 위해서는 작업 결과가 자동으로 커밋되지 않도록 autocommit을 false로 설정해두어야 하는데 자동커밋과 수동커밋에 대한 자세한 내용은 아래에서 살펴보도록 한다.
SQL을 작성하고 쿼리를 실행해 데이터베이스에 반영하려면 COMMIT을 하고 실행결과를 다시 되돌리고 싶으면 ROLLBACK을 한다. COMMIT을 하지 않으면 데이터가 임시로 저장되기 때문에 트랜잭션을 시작한 사용자가 아닌 다른 사용자에게는 데이터의 변경사항이 조회되지 않는다. 만약 커밋하지 않은 모든 데이터의 변경사항이 다른 사용자에게도 조회가 된다면 다양한 문제가 발생할 수 있다.
커밋방법에는 자동커밋과 수동커밋이 있다. 말그대로 자동커밋은 SQL을 실행하는 즉시 데이터베이스에 모든 변경사항이 반영되는 것이고 수동커밋은 임시로 데이터가 저장되기 때문에 롤백으로 실행 결과를 되돌릴 수 있다. 개발자가 원하는 트랜잭션 기능을 제대로 사용하기 위해서는 수동커밋을 활용하는 것이 좋다.