트랜잭션은 여러 개의 수행이 일련의 처리 단위로 묶여 작업의 완전성을 보장해주는 것이다. 만약에 하나의 작업을 위해 3개의 작은 작업들이 돌아가야 한다면 트랜잭션은 이 3개의 작은 작업이 모두 성공적으로 완료되어야만 큰 하나의 작업을 끝낼 수 있도록 해준다. 만약 작은 3개의 작업 중 하나라도 실패를 한다면 바로 이전의 작은 작업들을 실행하기 전으로 되돌려준다. 이는 사용자 입장에서는 작업의 논리적 단위로 이해할 수 있고, 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.
트랜잭션은 ACID라는 4가지 특성을 가진다.
트랜잭션 중간에 문제가 발생할 경우 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생하지 않았을 때에만 모든 작업이 수행되어야 한다.
즉, 하나의 트랜잭션에 묶인 여러 수행들은 하나의 수행처럼 이뤄져야 한다.
트랜잭션이 완료된 다음에도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성이 유지되어야 한다.
각각의 트랜잭션은 서로의 간섭없이 독립적으로 수행되어야 한다.
트랜잭션이 정상적으로 완료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 유지되어야 한다.
Commit 요청이 들어오면 Partially committed는 상태가 된다. 이후 Commit을 문제없이 수행할 수 있다고 판단되면 Committed 상태로 전이되고, 만약 Commit을 하기 전에 오류가 발생하면 Failed 상태로 전이된다.
트랜잭션은 반드시 필요한 상황에서만 최소한으로 적용해야 한다. 이는 트랜잭션 범위의 최소화를 의미한다. 데이터베이스의 커넥션 수는 정해져 있는데, 각각의 단위 프로그램이 커넥션을 오랫동안 소지하고 있게 되면 사용 가능한 커넥션의 개수가 줄어들게 되고 이 상황이 반복될 경우 사용 가능한 커넥션을 위해 기다려야 하는 경우가 발생할 수도 있다.
Lock은 트랜잭션 처리의 순차성을 보장하기 위한 방법이다. 트랜잭션이 순차적으로 처리되도록 함으로써 손실된 업데이트를 방지하는데 중요한 역할을 하고, 자동으로 발생한다. Lock을 통해 데이터에 대한 일관성 유지, 동시 사용이 가능해진다.
데이터를 읽을 때 사용되어지는 Lock이다. 데이터를 읽을 때에는 데이터의 변경이 발생하지 않기 때문에 Shared Lock끼리는 같은 데이터에 동시에 접근이 가능하다.
데이터를 변경하고자 할 때 사용되는 Lock으로 트랜잭션이 완료될 때까지 유지된다. Exclusive Lock이 해제될 때까지 다른 트랜잭션은 해당 리소스에 접근할 수 없다. 그리고 다른 트랜잭션이 수행되고 있는 데이터에 대하여 함께 Lock을 설정할 수 없다.
블로킹은 Lock 간의 경합이 발생하여 특정 트랜잭션이 작업을 진행하지 못하고 멈춰있는 상태를 말한다. 이때의 두 Lock은 베타-베타 혹은 베타-공유 이다. 공유-공유 간에는 블로킹이 발생하지 않는다. 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료되어야 한다. 이전의 트랜잭션으로 인해 그 다음 트랜잭션이 접근하지 못하고 자신의 순서를 기다리는 것이다. 블로킹은 성능에 좋지 않은 영향을 미치기 때문에 DB를 사용하는 프로그래밍을 진행할 때에는 다음과 같은 부분을 주의해야한다.
교착 상태는 두 개의 트랜잭션이 각각의 하나씩의 리소스에 Lock을 건 상태로 서로의 리소스에 접근하여 값을 얻어오려 할 때에 각각의 Lock에 의해 양쪽 트랜잭션이 결국은 서로를 끝없이 기다리는 현상을 말한다. 이렇게 되면 프로그램이 아무일도 하지 못하고 멈춰버리게 된다.