--목차--
1. 트랜잭션?
2. 트랜잭션과 Lock의 차이
3. 트랜잭션의 특성
4. 트랜잭션의 상태
5. 주의할 점
6. DBMS의 트랜잭션 관리 전략
--------
1. 트랜잭션(Transaction)?
- 논리적인 작업 셋을 모두 완벽하게 처리하거나 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능.
- SELECT, UPDATE, INSERT, DELETE 같은 연산을 수행해 데이터베이스 상태를 변화시키는 작업의 단위.
- 작업의 완전성 보장.
- 유저 입장: 작업의 논리적 단위로 이해 가능.
- 시스템 입장 : 데이터들을 접근 / 변경하는 프로그램의 단위.
2. 트랜잭션과 Lock
1) 잠금(Lock)
동시성 제어를 위한 기능.
여러 커넥션에서 동시에 동일한 자원 요청시 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해줌.
(자원 : 레코드, 테이블)
2) 트랜잭션
데이터의 정합성을 보장하기 위한 기능.
꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합되었을 때만 의미있는 개념은 아님.
하나의 논리적인 작업셋 중 쿼리 수와 관계없이 논리적인 작업 셋 자체가 100% 적용 / 아무것도 적용되지 않아야 함 보장.
(HW 에러 / SW 에러와 같은 문제로 인해 작업에 실패가 있을 경우 문제 해결을 위함)
3. 트랜잭션의 특징(ACID)
1) 원자성(Atomicity)
트랜잭션 중간에 어떤 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무 문제가 발생하지 않았을 경우에만 모든 작업을 수행해야 함.
2) 일관성(Consistency)
트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 함.
3) 고립성(Isolation)
각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 함.
4) 지속성(Durability)
트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 함.
4. 트랜잭션의 상태

1) Active
트랜잭션의 활동 상태. 트랜잭션이 실행중이며 동작중인 상태.
2) Failed
트랜잭션의 실패 상태. 트랜잭션이 정상적으로 진행할 수 없는 상태.
3) Partially Comitted
트랜잭션의 Commit 명령이 도착한 상태. 트랜잭션의 commit 이전 sql문이 수행되고 commit만 남은 상태.
4) Committed
트랜잭션 완료 상태. 트랜잭션이 정상적으로 완료된 상태.
5) Aborted
트랜잭션 취소 상태. 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태.
6) Partially Committed vs Committed
Partically Committed: Commit 요청이 들어왔을 때.
Committed : Commit을 정상적으로 완료한 상태.
Commit 요청이 들어오면 Partially Committed 상태가 된다. 이후 Commit을 문제 없이 실행하면 Committed 상태로 전이되고, 오류가 발생하면 Failed 상태가 된다.
7) Commit
하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태에 있을 때 하나의 트랜잭션이 끝났음을 알려주기 위해 사용하는 연산.
8) Rollback
하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소하는 연산.
5. 트랜잭션 사용할 때 주의점
트랜잭션의 범위를 최소화하는 게 좋다.
데이터베이스 커넥션은 개수가 제한적이다.
그러나 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 감소하고, 어느 순간 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황 발생.
6. DBMS의 트랜잭션 관리 전략
https://gyoogle.dev/blog/computer-science/data-base/Transaction.html
참조
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#index