데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업의 단위
두 명 이상의 데이터베이스 사용자가 동일한 데이터 항목에 대해 동시에 변경을 수행하여 생길 수 있는 데이터의 부적절한 변경을 방지하기 위해 동시성을 제어하는 역할을 한다.
Atomicity : 원자성
- 원자와 같이 트랜잭션을 더 이상 쪼갤 수 없는 단위라 생각하고 트랜잭션을 진행하며 모든 연산이 완전히 반영되거나 전혀 반형되지 않아야 함을 보장하는 특성
- All or Nothing으로, 모든 연산들이 실패 없이 성공적으로 완료되면 Commit을 하고, 하나라도 실패하면 모든 연산들을 취소하고 트랜잭션 실행 바로 직전의 상태로 되돌리는 Rollback을 진행한다.
Consistency : 일관성
- 트랜잭션이 성공적으로 실행 된 후에도 데이터베이스가 일관성 있는 상태를 가지고 있어야 함을 보장하는 특성
- 변경된 데이터의 값이 정의된 제약조건이나 cascade, trigger에 맞게 변경되어야한다.
Isolation : 독립성
- 둘 이상의 트랜잭션이 동시에 실행 될 때, 실행되는 각각의 트랜잭션이 서로의 연산에 끼어들 수 없어야 함을 보장하는 특성
- Lock을 통해 독립성을 보장하고 있으며, 독립성을 통해 업데이트가 누락되거나, 데이터가 꼬이는 것을 방지한다.
Durability : 지속성
- 트랜잭션이 성공적으로 완료 되었으면 해당 트랜잭션의 결과는 영구적으로 반영되어야 함을 보장하는 특성
- 트랜잭션이 성공적으로 완료되어 Commit을 하려고 할 때 어떠한 이유로 DB의 서버가 강제종료 되어도 DB 서버가 다시 살아났을 때 완료된 데이터는 그대로 Commit이 되어야한다.
- 활동(Active) : 트랜잭션이 실행 중인 상태
- 부분적 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행되었지만 Commit 연산이 실행되기 직전의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
- 실패(Failed) : 트랜잭션 실행 중 오류가 발생하여 중단된 상태
- 철회(Aborted) : 트랜잭션이 실패하여 Rollback 연산을 수행한 상태
트랜잭션의 연산
- Commit : 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로 완료된 모든 내용을 데이터베이스에 영구적으로 저장하는 것이다.
- Rollback : 트랜잭션의 처리과정에서 발생한 변경사항들을 모두 취소하는 명령어로 트랜잭션이 시작하기 전의 상태로 되돌리는 것이다.
❌ 애플리케이션과 데이터베이스를 커넥션이 연결하고 있다. 하지만 이 커넥션의 개수는 제한적이기 때문에 트랜잭션이 커넥션을 소유하는 시간이 길어지면 다른 트랜잭션에서 사용할 수 있는 커넥션의 수가 줄어든다.
⭕ 필요한 기능 범위에서만 최소한으로 정의하여 소유 시간을 줄여야한다.
❌ 교착상태- 두 개 이상의 트랜잭션이 특정 자원을 잠근 뒤 다른 트랜잭션에서 잠긴 자원을 요구하여 시간이 지나도 진행하지 못하는 상태를 의미한다.
⭕ 트랜잭션을 자주 커밋하여 트랜잭션 실행 중 잠금의 시간을 줄인다.
정해진 순서대로 테이블에 접근하여 서로 엇갈려 잠금을 하지 않게 한다.
**추가로
트랜잭션 격리수준