트랜잭션이란 여러 개의 작업들을 하나의 실행 유닛으로 묶어준 것입니다.
각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 끝나게 되어 있습니다. 만약에 한 개의 작업이라도 실패하게 된다면 전부 실패를 하게 됩니다.
다시 말해 작업이 하나라도 실패를 하게 되면 트랜잭션도 실패이고 모든 작업이 성공적이면 트랜잭션 또한 성공적이게 됩니다.
트랜잭션은 성공 혹은 실패 이 두개의 결과만 존재한다.
테이터베이스 트랜잭션의 정의는 ACID 특성을 가지고 있습니다.
*쿼리 : 데이터베이스에 정보를 요청하는 것.
웹서버에 특정한 정보를 보여달라는 웹 클라이언트 요청(주로 문자열을 기반으로 한 요청)에 의한 처리이다.
ACID는 Atomicity, Consistency, Isolation, Durability를 의미합니다.
각 단어들은 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안전성을 보장하기 위해 필요한 성질들 입니다.
예를 들어 설명하겠습니다.
계좌이체를 한다고 했을 때 계좌 이체는 두 가지 단계로 진행됩니다.
1. 계좌 A에서 돈을 꺼냅니다.
2. 계좌 B에 돈을 추가합니다.
만약에 계좌 이체에서 1번만 수행되거나 2번만 수행이 된다면 돈이 제대로 이체가 되지 않아 문제가 발생하게 됩니다. 두 가지 단계 중 하나라도 성공하지 못하면 전부 실패로 돌아가야 한다는 것이 원자성입니다.
예를 들어 설명하겠습니다.
각 고객은 이름이 있어야 하는 데이터베이스 제약이 있다고 하겠습니다.
다음과 같은 트랜잭션들은 해당 성질을 위반합니다.
-이름 없는 새로운 고객을 추가하는 쿼리
-기존 고객의 이름을 삭제하는 쿼리
각 데이터베이스의 유효한 상태는 다를 수 있지만 상태에 대한 일관성은 변하지 않아야 한다. 위 예시에서는 '이름이 있어야 한다'라는 제약을 위반하고 있습니다.
예를 들어 설명하겠습니다.
계좌에 만 원이 있다고 가정해보겠습니다.
1.해당 계좌로부터 계좌 B로 6천원의 계좌 이체와 계좌 C에 6천원의 계좌 이체를 동시에 하는 경우
2.연속으로 계좌 B에 먼저 보낸 뒤 계좌 C에 보내는 경우
두 경우의 결과가 동일해야 한다는 의미 입니다.
즉, 동시에 한다고 해서 각각 6천원씩 계좌 이체 후에 마이너스 통장이 되는 것이 아닌 연속으로 하는 것과 동일한 결과를 나타내야 합니다.
이에 따라 각 트랜젝션은 다른 트랜젝션의 연산 내용을 알 수 없습니다. 또한 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 합니다.
예를 들어 설명하겠습니다.
은행에서 계좌이체를 성공적으로 한 뒤에 해당 은행 데이터베이스에 오류가 발생해 종료되어도 계좌이체 내역은 남아있어야 합니다.
만약, 계좌이체를 로그로 기록하기 전에 시스템 오류 등에 의해 종료가 된다면 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌이체 이전 상태들로 돌아가게 됩니다.