1. Transaction
1) Transaction
- 트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위라고 할 수 있으며 트랜잭션에는 여러 개의 연산이 수행도리 수 있다.
- 트랜잭션은 수행중에 한 작업이라도 실패하면 전부 실패하고, 모두 성공해야 성공이라고 할 수 있다.
2) Transaction의 ACID 4가지 특징
- ACID는 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질이다.
- Atomicity(원자성) : 트랜잭션의 연산은 모든 연산이 완벽히 수행되어야 하며, 한 연산이라도 실패하면 트랜잭션은 실패해야 한다.
- Consistency(일관성) : 트랜잭션은 유효한 상태로만 변경될 수 있다.
- Isolation(고립성) : 트랜잭션은 동시에 실행될 경우 다른 트랜잭션에 의해 영향받지 않고 독립적으로 실행되어야 한다.
- Durability(내구성) : 트랜잭션이 정상적으로 완료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 유지되어야 한다.
3) Transaction의 Commit과 Rollback
- Commit : commit 연산은 하나의 트랜잭션이 성공적으로 끝났고 데이터 베이스가 일관성있는 상태에 있을 때 하나의 트랜잭션이 끝났음을 알려주기 위해 사용하는 연산이다.
- Rollback : 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터의 일관성이 깨지면, 이 트랜잭션의 일부가 정상적으로 처리되더라두 트랜잭션의 원자성을 위하여 트랜잭션이 했던 모든 연산을 취소 상태로 돌려놓는 연산이다.
4) Transaction의 상태
- 활동 (Active) : 트랜잭션의 활동 상태이며 트랜잭션이 실행중이며 동작중인 상태이다.
- 부분 완료(Partially Commited) : 트랜잭션의 commit 명령어가 도착한 상태이며 트랜잭션의 commit 이전 sql 문이 수행되고 commit 만이 남은 상태이다.
- 완료 (Committed) : 트랜잭션이 완료된 상태이다. 트랜잭션이 정상적으로 완료된 상태를 말한다.
- 실패 (Failed) : 트랜잭션이 실패한 상태이다. 트랜잭션이 더이상 정상적으로 동작할 수 없는 상태를 말한다.
- 취소(Aborted) : 트랜잭션이 취소된 상태이다. 트랜잭션이 취소되어 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.
commit 요청이 들어오면 상태는 부분완료가 되며 이후 commit을 문제없이 수행 가능하면 완료 상태로 변경된다. 만약 오류가 발생하면 실패 상태가 된다.
4) Transaction의 사용 주의점
- 트랜잭션은 반드시 필요한 상황에서만 최소한으로 적용해야 하며 이는 트랜잭션 범위를 최소화를 의미한다.
- 데이터베이스의 커넥션의 수는 정해져 있는데 각각이 단위 프로그램이 커넥션을 오랫동안 가지고 있으면 사용 가능한 커넥션의 수가 줄어든다.
- 커넥션의 수가 계속줄어들으면 사용 가능한 커넥션을 기다려야 하는 경우도 발생한다.
2. Lock
1) Lock
- Lock은 트랜잭션의 처리 순차성을 보장하기 위한 방법이다.
- 트랜잭션이 순차적으로 처리되도록 하며 손실된 업데이트를 방지하는데 중요한 역할을 하고 자동으로 발생한다.
- Lock을 통해 데이터에 대한 일관성을 유지하고 동시 사용이 가능해진다.
2) Lock 의 종류
- Shared Lock (Read Lock : 공유 락)
- 데이터를 읽을 때 사용되는 Lock이다.
- 데이터를 읽을 때는 데이터의 변경이 발생하지 않기 때문에 Shared Lock끼리 같은 데이터에 동시에 접근이 가능하다.
- Exclusive Lock (Write Lock : 베타 락)
- 데이터를 변경할 때 사용되는 Lock으로 트랜잭션이 완료될 때까지 유지된다.
- Exclusive Lock이 해제될 때 까지 다른 트랜잭션은 해당 리소스에 접근할 수 없다.
3. Blocking
1) Blocking
- 블로킹은 Lock 간의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태이다.
- 공유락끼리는 블록킹이 발생하지 않지만 베타락은 블록킹이 발생 시킨다.
- 블록킹을 해결하기 위해 이전의 트랜잭션이 완료(커밋이나 롤백) 되어야 한다.
- 다음에 들어온 트랜잭션은 이전 트랜잭션이 마무리 되어야 진행 가능하며 이런 블록킹은 성능에 안 좋은 영향을 끼친다. 따라서 이런 블록킹을 최소화할 필요가 있다.
2) Blocking을 방지 하는 방법
- 하나의 트랜잭션의 길이를 너무 길게하는 것은 블로킹에 대한 확률을 높인다.
- 초기 설계할 때 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야한다.
- 트랜잭션의 격리성 수준을 과하게 상향 조정하지 않아야 한다.
- 적절한 튜닝을 통해 쿼리의 성능을 높인다.
4. Dead Lock
1) Dead Lock(교착 상태)
- 교착상태란 두 개의 트랜잭션이 각각 하나의 리소스에 Lock을 건 상태로 서로의 리소스에 접근하여 값을 얻어오려고 할 때 각각의 Lock에 의해 양쪽 트랜잭션이 아무것도 못하고 모두 영원히 처리가 되지 않는 상태를 말한다.
- 이렇게 되면 프로그램이 아무 일도 하지 못하고 아예 멈춰버린다.
- 교착상태가 발생하면 DBMS가 둘 중 한 트랜잭션에 에러를 발생시켜 문제를 해결한다.
2) Dead Lock 방지 방법
- 정해진 순서로 테이블에 데이터를 접근한다. 트랜잭션이 모두 같은 순서로 이루어 진다면 Dead Lock의 빈도를 줄일 수 있다.
- 트랜잭션을 자주 커밋한다.
- 공유 Lock의 사용을 피한다.
- 테이블 단위의 Lock으로 갱신을 직렬화 한다면 동시성을 떨어질 수 있지만 DeadLock의 빈도를 줄일 수 있다.