트랜잭션
트랜잭션이란 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위입니다.
계좌이체로 예시를 들어보겠습니다.
계좌이체라는 논리적 기능을 수행하기 위해서는 내 계좌에서 돈을 빼는 '출금'이라는 과정과 상대방에 계좌에 돈을 넣는 '입금'이라는 과정을 거쳐야 합니다.
데이터베이스에서 계좌이체를 진행한다고 할 때 입금과 출금은 쿼리로 진행됩니다. 트랜잭션이란 여러 개의 쿼리들을 논리적 기능에 맞게 하나로 묶는 단위라고 할 수 있습니다.
무결성
쿼리를 트랜잭션이라는 단위로 묶는 이유는 데이터베이스의 무결성을 보장해 주기 위함입니다.
무결성이란 쉽게 말해 데이터베이스가 정확한가입니다.
내 계좌에 100만 원이 있다면 해당 은행의 데이터베이스에는 어떤 테이블에서도 내 계좌에는 100만 원이 있어야 합니다.
좀 더 구체적으로 말하자면 위의 설명처럼 데이터가 정확해야 하고 어떤 테이블에서도 정보가 일치해야 하며 사람의 나이에 -1 같은 유효하지 않은 숫자가 없는 것을 보장하는 게 무결성입니다.
트랜잭션의 특징(ACID)
트랜잭션의 특징은 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 앞글자를 따 ACID라고 합니다.
- 원자성
- 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징입니다.
- 앞서 설명한 계좌이체를 한 다음 취소한다고 했을 때 출금과 입금 중에 입금만 취소가 되면 다시 내 통장에 돈이 들어오지 않는 문제가 생깁니다. 그렇기 때문에 트랜잭션의 내부의 작업들은 모두 동일하게 수행되거나 모두 수행되지 않습니다.
- 일관성
- 트랜잭션이 완료되면 데이터베이스의 상태는 일관되게 유효해야 하는 것입니다..
- 트랜잭션으로 사람의 나이가 -1살이 되면 데이터베이스는 유효하지 못하므로 해당 트랜잭션은 수행할 수 없습니다.
- 격리성
- 여러 개의 트랜잭션들이 동시에 실행중일 때 서로 다른 트랜잭션의 연산에 끼어들지 못하는 것입니다.
- 막연하게 아예 끼어들 수 없는 것이 아니라 격리성은 여러 개의 격리 수준으로 나뉩니다. 아래로 갈수록 동시성은 약해지고 격리성은 강해집니다. 격리성이 높아질수록 트랜잭션이 더욱 독립적으로 동작할 수 있으나 성능이 안 좋아집니다.
- 격리 수준과 발생하는 문제점입니다.
- READ_UNCOMMITTED
- 더티 리드
- 한 트랜잭션에서 작업이 완료(커밋) 되지 않았음에도 그 결과를 다른 트랜잭션에서 볼 수 있게 되는 현상입니다.
- A테이블에서 X의 나이를 15에서 16으로 바꾸는 트랜잭션을 수행하고 커밋하지 않았음에도 B테이블에서 X의 나이를 조회했을 때 16으로 확인되는 경우입니다.
- 더티 리드
- READ_COMMITTED
- 반복 가능하지 않은 조회(non-repeatable read)
- 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우입니다.
- A테이블에서 X의 나이를 15에서 16으로 바꾸는 트랜잭션을 수행하고 커밋하지 않았을 때는 B테이블에서 X의 나이를 조회했을 때 15로 확인했으나 A테이블에서 커밋 후 B테이블에서 동일한 쿼리를 보냈을 때 16으로 바뀌어 조회 결과가 달라진 경우입니다.
- 반복 가능하지 않은 조회(non-repeatable read)
- REPEATABLE-READ
- 팬텀 리드
- 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과로 없던 레코드가 생기거나 있던 레코드가 사라진 경우입니다.
- non-repeatable read와 마찬가지로 커밋 후 결과가 달라진 경우인데 non-repeatable read는 기존에 있던 데이터가 변경된 것이고 팬텀 리드는 새로운 레코드가 생긴 거나 사라진 경우입니다.
- 팬텀 리드
- SERIALIZABLE
- READ_UNCOMMITTED
- 지속성
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것입니다.
- 한번 완료된 트랜잭션은 취소되면 안됩니다.
※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.
'CS > 데이터베이스' 카테고리의 다른 글
인덱스의 정의 (0) | 2023.02.27 |
---|---|
NoSQL(비관계형) 데이터베이스 (0) | 2023.02.17 |
관계형 데이터베이스 (0) | 2023.02.14 |
데이터베이스 정규화 (1) | 2023.02.01 |
데이터베이스 기초 (1) | 2023.01.27 |