반응형
트랜잭션이란.
- 데이터베이스의 데이터를 조작하는 작업의 단위.
- 트랜잭션은 이론적으로 ACID 원칙을 보장해야 한다.
- Atomicity (원자성) : 트랜잭션의 부분 작업만 성공할 순 없다. 전체가 성공하거나, 전체가 실패해야 한다.
- Consistency (일관성) : 트랜잭션이 성공하면 언제나 일관성이 있는 데이터베이스 상태를 유지하는 것을 의미. 만약 모든 계좌는 잔고가 있어야 한다면, 이를 위반하는 트랜잭션은 중단된다.
- Isolation (독립성) : 하나의 트랜잭션이 실행되고 있을 때, 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다.
- Durability (지속성) : 성공적으로 수행된 트랜잭션은 영원이 반영되어야 한다. 모든 트랜잭션은 로그로 남고, 시스템 장애 발생 전으로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.
- 하지만 실제로는 ACID 원칙이 모두 완벽하게 지켜지지는 않는다.
- 완벽하게 지킬 수록 동시성이 매우 떨어지기 때문.
- 따라서 각 level 별 transaction lock level이 존재한다.
Inno DB에서의 Lock
InnoDB는 transaction의 ACID 원칙과 동시성을 최대한 보장하기 위해 다양한 종류의 lock을 사용한다.
Row Lock
- 테이블이 row에 락을 거는 것으로 2가지 유형이 있다.
- Shared Lock : select (read)에 대한 lock이다. 동일한 읽기를 보장하며, read 작업을 할 때 innoDB가 각 row에 락을 건다.
- Exclusive Lock : write에 대한 lock이다. update, delete 구문 등 데이터 수정 쿼리 날릴 때 row에 걸리는 lock이다.
- Shared Lock과 Exclusive Lock을 거는 조건
- 동시에 여러 transaction이 한 row에 shared lock을 걸 수 있다. 즉 동시에 여러 transaction이 row를 읽을 수 있다.
- shared lock 이 걸려있는 row에 다른 transaction이 exclusive lock을 걸 순 없다. 즉 다른 transaction이 row를 읽는 동안 수정/삭제가 불가능하다.
- exclusive lock이 걸려있는 동안 다른 transaction들은 shared lock과 exclusive lock 모두 걸 수 없다.
Record Lock
- Table의 row에 걸리는 lock이 아닌, DB의 Index Record에 걸리는 lock이다. Row Lock과 마찬가지로 Shared Lock과 Exclusive Lock이 있다.
Gap Lock
- Index Record의 Gap 사이에 걸리는 lock.
- record 테이블에서 인덱스와 인덱스 사이 즉 record가 없는 부분에 걸리는 lock이다.
- record lock은 이미 있는 row가 변경되지 않도록 하기 위해 사용되는 반면, gap lock은 새로운 row가 추가되는 것을 막기 위해 사용된다.
Lock이 걸리고 풀리는 타이밍
- Lock은 트랜잭션이 Begin으로 시작될 때 걸리고, commit 또는 rollback 될 때 풀린다.
반응형
'Programming > Database' 카테고리의 다른 글
[Redis] 여러 키 한번에 삭제하기 (0) | 2020.10.28 |
---|---|
[Mysql] group_concat 으로 그룹핑한 데이터 하나로 모으기 (0) | 2020.07.04 |
[Mysql] 버전 문자열 비교 및 숫자 변환 (2) | 2019.06.05 |
DBMS의 장점 (0) | 2016.06.20 |
데이터베이스 사용자 (0) | 2016.06.20 |