트랜잭션 ?
- 데이터베이스의 상태를 변화시키기 위해서 수행하기 위한
하나 이상의 쿼리를 모아 놓은 하나의 작업의 단위
1) 각 트랜잭션은 하나의 특정 작업으로 시작을 해서 묶여 있는 모든 작업들을
다 완료해야 정상적으로 종료한다.
2) 만약 하나의 트랜잭션에 속해있는 여러 작업 중에서 단 하나의 작업이라도 실패하면,
이 트랜잭션에 속한 모든 작업을 실패한 것으로 판단한다.
3) 작업이 하나라도 실패를 하게 되면 트랜잭션도 실패이고,
모든 작업이 성공적이면 트랜잭션 또한 성공이다.
4) 성공 또는 실패 라는 두 개의 결과만 존재하는 트랜잭션은,
미완료된 작업없이 모든 작업을 성공해야 한다.
트랜잭션 특징
ACID = 원자성(Atomicity), 일관성(Consistency), 격리성.고립성(Isolation), 지속성(Durability)
- 원자성
- 트랜잭션이 DB에 모두 반영되거나, 전혀 반영되지 않거나를 뜻한다. All or Nothing
- 안전성 보장을 위해 필요한 성질
예시
1) A 계좌에서 출금하는 일에 성공했지만, B 계좌에 입금하는 작업에 실패한다면 계좌 A에서 출금하는 작업을 포함하여 모든 작업이 실패로 돌아가야 한다
- 일관성
- 작업 처리의 결과가 항상 일관되어야 한다. (즉, 데이터 타입이 반환 후와 전이 항상 동일해야 한다)
예시
1) 모든 고객은 반드시 이름을 가지고 있어야 한다’는 데이터베이스의 제약이 있다고 가정
2) 이름 없는 새로운 고객을 추가하는 쿼리
3) 기존 고객의 이름을 삭제하는 쿼리- 위의 예시는 일관성을 위반하기에 예시 트랜잭션이 일어나면 데이터베이스는 일관되지 않는 상태를 가지게 된다.
- 고립성,격리성(독립성)
- 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없고 마찬가지로 독립적임
- 각각의 트랜잭션은 독립적이라 서로 간섭이 불가능
- 실제로 동시에 여러 개의 트랜잭션들이 수행될 때, 각 트랜젝션은 고립(격리)되어 있어 연속으로 실행된 것과 동일한 결과를 나타낸다
예시
1) 계좌에 만원이 있고 B 계좌로 6천원 C 계좌로 6천원을 동시에 계좌 이체한다고 가정
2) 계좌 B에 먼저 송금하고 계좌 C에 보내는 결과와 동일해야함
3) 동시에 트랜잭션을 실행한다해서 B,C 로 송금하고 마이너스 통장이 되는것은 아님
- 지속성
- 트랜잭션이 성공적으로 완료되면 영구적으로 결과에 반영 되어야 함
- 보통 commit 이 된다면 지속성은 만족할 수 있다.
예시
1) 계좌이체를 성공적으로 실행한 뒤에, 해당 은행 데이터베이스에 오류가 발생해도 계좌이체 내역은 기록으로 남아야한다.
2) 계좌이체를 로그로 기록하기 전에 오류가 발생하면 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌 이전 상태로 돌아간다
트랜잭션의 상태