Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 정렬
- 개발자의 마인드
- ssl.key
- django slack bot
- innodb_buffer_pool_size 오류
- #데이터베이스 #트랜잭션 #ACID #격리수준
- 개발자와 비즈니스
- 비즈니스적 관점에서 생각하는 개발자 #개발자 마인드
- 웹소켓 api
- 알고리즘
- public.pem
- 데이터베이스 오류
- django slack
- #백준 #드래곤커브 #알고리즘
- 슬랙봇
- 개발자와 비즈니스 관계
- slack bot
- add colume
- 개발자에세이
- AWS Aurora
- #알고리즘
- sed명령어
- 비즈니스
- private.pem
- 숲을 바라보는 개발자
- MySQL
- 비즈니스적 관점에서 생각하는 개발자
- django 슬랙봇
- django #django 5.0 #django 5.0 요약
- 업비트 웹소켓
Archives
- Today
- Total
Info-Tech
데이터베이스 트랜잭션 본문
데이터베이스에서 하나의 논리적인 실행단계를 트랜잭션이라고 한다.
은행에서 계좌이체를 트랜잭션이라고 할 수 있다. 이러한 트랜잭션이 안전하게 이루어지기 위해서는 ACID가 지켜져야 한다.
- Atomicity (원자성)
- 은행에서 계좌이체를 할 때 돈을 보내는 계좌에서는 돈이 차감이 되었지만, 받는 사람의 걔좌에서는 입금이 되지 않으면 안된다.
- 이처럼 처음부터 끝까지 작업이 실패하면 안되도록 하는 것이다.
- Consistency(일관성)
- 트랜잭션이 성공되면 언제나 일관성 있는 데이터베이스 상태로 유지되어야 한다. 트랜잭션 전, 후 데이터베이스가 정해논 제약을 어겨서는 안된다.
- Isolation(고립성)
- 트랜잭션 수행시 다른 트랜잭션의 연산작업이 끼어들지 못하도록 막는 역할이다. 즉, 각 트랜잭션끼리 영향을 끼쳐서는 안된다.
- Durability(지속성)
- 트랜잭션을 성공적으로 마치면 그 결과가 정확히, 영구적으로 반영이 되어야 한다.
이런 4가지 원칙이 있습니다. 이 중에서 ‘고립성’에 대한 약간의 이슈가 있습니다.
고립성은 다른 트랜잭션이 끼어들지 못하게 순차적으로 실행하게 됩니다. 그럴 경우 동시성이 이루어 지지 못하기 때문에 속도저하와 같은 현상이 발생 할 가능성이 있습니다.
반대로 병렬처리를 하게 되면 데이터의 무결성이 깨질 수 있습니다.
격리성 관련 문제점
- Dirty Read
- 한 트랜잭션(T1) 이 데이터를 ‘A’에서 ‘B’로 변경했고 커밋을 안한 상태, 다른 트랜잭션이(T2) 해당 데이터를 읽게 되면?
- T2가 가지는 데이터는 B가 되지만, 만약 T1가 커밋을 안할 경우 데이터가 꼬일 수 있다.
- T1 데이터 변경 -> T2 read -> T1 non commit
- Non- Repeatable Read
- 한 트랜잭션(T1)이 데이터를 Read. 다른 트랜잭션(T2)가 데이터에 접근하여 값을 변경하거나 삭제하는 경우
- 그 후 T1이 다시 그 값을 Read하는 경우 변경된 데이터나 삭제된 데이터를 찾게된다.
- 즉 한 트랜잭션 안에서 같은 쿼리를 두 번 수행할 때, 다른 트랜잭션의 수정이나 삭제로 인해 쿼리의 결과가 다른경우
- Phantom Read
- 트랜잭션(T1)이 특정 Data를 Read 했다. 다른 트랙잭션(T2)가 해당 데이터의 일부를 삭제 / 변경을 했다.
- 다시 T1이 데이터를 조회하게되면 삭제 /변경된 데이터가 조회 / 누락된다.
- 즉 한 트랜잭션에서 두 번의 쿼리를 수행 할 때, 다른 트랜잭션의 입력으로 인해 첫 번째에 없었던 레코드가 두번째에서는 생기는 현상
즉 이러한 문제점들을 Trade -off를 하면서 해결하고자 4가지의 격리수준으로 나뉘게 된다.
내려갈수록 격리수준이 높아져 언급된 문제점들은 해결 할 수 있지만, 성능이 떨어지게 된다. 따라서 상황에 따라(?) 적절하게 사용해야한다.
격리수준
- Read Uncommited
- 아직 커밋되지 않은 데이터를 읽을 수 있다.
- Dirty Read, Non- Repeatable Read, Phantom Read 문제가 발생 할 수 있다.
- Read Commited
- 커밋이 완료된 데이터만 읽을 수 있다.
- Non- Repeatable Read, Phantom Read 문제가 발생 할 수 있다.
- Repeatable Read
- 트랜잭션을 읽은 데이터를 해당 트랜잭션이 종료될 때까지 다른트랜잭션의 수정이나 삭제가 가능하지 않도록 한다.
- Phantom Read 문제가 발생 할 수 있다. (새로운 입력이 가능함으로)
- Serailizable(가장 완벽한 격리)
- 해당 트랜잭션이 종료 될 때까지 다른 트랜잭션에 의한 새로운 레코드가 삽입이 안되도록 한다.
- 모든 경우에서 커버가 가능.
Comments