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
- 팀플회고
- 깃 터미널 연동
- 데이터베이스
- React Native
- 스터디
- 리액트 네이티브 시작하기
- 모두를 위한 딥러닝
- 리액트 네이티브
- 모두의네트워크
- 백준 4949번
- 백준 5525번
- 딥러닝
- 모두의 네트워크
- 백준 4358번
- 문자열
- SQL
- 정리
- 백준
- 자바
- 깃 연동
- 지네릭스
- 깃허브 토큰 인증
- 데베
- 리액트 네이티브 프로젝트 생성
- HTTP
- 백준 4358 자바
- 깃허브 로그인
- 모두를위한딥러닝
- 머신러닝
- 네트워크
Archives
- Today
- Total
솜이의 데브로그
7장 ) 트랜잭션과 동시성 제어 본문
Reference : 데이터베이스 첫걸음
10강 ) 트랜잭션을 다룰 수 있는 테이블
데이터베이스에서 한 덩어리의 쿼리 처리 단위를 '트랜잭션' 이라고 한다.
데이터베이스에서는 복수의 쿼리를 연속적으로 사용해 일관성 있는 한 단위로 취급한다.
트랜잭션은 4가지 특성으로 정의되며 ACID 특성이라고 한다.
- Atomicity (원자성)
- Consistency (일관성)
- Isolation (고립성 또는 격리성)
- Durability (지속성)
원자성
- 데이터의 변경을 수반하는 일련의 데이터 조작이 전부 성공할지 전부 실패할지를 보증하는 구조.
- 데이터 처리 도중 오류가 발생하는 경우, ROLLBACK을 실행한다.
일관성
- 일련의 데이터 조작 전후에 그 상태를 유지한다.
- 사용자를 임의로 식별하기 위해 일련번호를 사용자에게 발급, 번호에 유니크 제약을 설정해 중복된 사용자 번호를 저장할 수 없도록 한다.
고립성
- 일련의 데이터 조작을 복수 사용자가 동시에 실행해도 '각각의 처리가 모순 없이 실행되는 것을 보증'.
- 데이터베이스 오브젝트인 테이블에 대해 '잠금'을 걸어서 후속 처리를 블록한다. 잠금 단위에는 테이블 전체, 블록, 행 등이 있으며, MySQL에서는 트랜잭션 처리를 할 때 주로 행 단위의 잠금 기능을 이용한다.
- 직렬화 가능 이외에 자신이 아닌 다른 트랜잭션의 영향 받는 것을 허용하는 4개의 단계
- 커밋되지 않은 읽기
- 커밋된 읽기
- 반복 읽기
- 직렬화 가능
지속성
- 일련의 데이터 조작을 완료하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어 그 결과를 잃지 않는 것.
- 시스템이 정상일 때만이 아니라 데이터베이스나 OS 이상 종료, 시스템 장애도 견딜 수 있다는 뜻을 의미한다.
다른 커넥션에서 테이블 볼 때
- DDL에 따른 암묵적인 커밋
- MySQL이나 Oracle에서는 CREATE TABLE과 같은 DDL 실행 시 암묵적인 커밋이 발생한다.
- 오토커밋 설정
- 트랜잭션의 개시가 명시적으로 지정되지 않았을 때 트랜잭션을 구별하는 방법
- 하나의 SQL문이 하나의 트랜잭션으로 구분
- 사용자가 COMMIT 또는 ROLLBACK을 실행하기까지가 하나의 트랜잭션이 된다.
- 트랜잭션의 개시가 명시적으로 지정되지 않았을 때 트랜잭션을 구별하는 방법
- DDL : Data Definition Language, 스키마 또는 테이블을 작성하거나 제거
- DML : Data Manipulation Language, 테이블의 행을 검색하거나 변경하는데 사용
- DCL : Data Control Language, 데이터베이스에서 실행한 변경을 확정하거나 취소하는 데 사용
11강 ) 복수 커넥션에서 읽기와 쓰기
MySQL은 MVCC라는 기술을 사용한다. 따라서 다음 특성을 가진다.
- 읽기를 수행할 경우 갱신중이라도 블록되지 않는다.
- 읽기 내용은 격리 수준에 따라 내용이 바뀌는 경우가 있다.
- 갱신 시 배타적 잠금을 얻는다. 잠금은 기본적으로 행 단위로 얻으며 트랜잭션이 종료할 때까지 유지한다. 격리 수준이나 InnoDB의 설정에 따라 실제로 잠금 하는 행의 범위가 다른 경우가 있다.
- 갱신과 갱신은 나중에 온 트랜잭션이 잠금을 획득하려고 할 때 블록된다. 일정 시간을 기다리며 그 사이에 잠금을 획득할 수 없는 경우 잠금 타임아웃이 된다.
- 갱신하는 경우 갱신 정의 데이터를 undo 로그로 롤백 세그먼트라는 영역에 유지한다.
트랜잭션 격리 수준별 외관
- 반복 읽기
- 커밋된 읽기
- 갱신을 수행하는 트랜잭션 자신
12강 ) 잠금 타임아웃과 교착 상태
잠금 타임아웃
- 서로를 블록하지 않지만, 갱신끼리 부딪치는 경우 나중에 온 갱신이 잠금 대기상태가 된다.
- 잠금해제를 기다리고 있는 쪽에서는 잠금을 기다리는 여부와 시간을 설정할 수 있다.
교착 상태
- 트랜잭션끼리 각 다른 테이블에 잠금을 유지한 채 서로 잠금을 건 자원에 잠금이 필요한 처리(INSERT/ UPDATE/ DELETE) 를 실행한 상황을 말한다.
- 일반적인 DBMS에서는 교착 상태를 독자적으로 검출해 교착 상태를 보고한다.
- MySQL도 교착상태가 일어나면 즉시 인식해 시스템에 영향이 작은 쪽의 트랜잭션을 트랜잭션 개시 시점까지 롤백한다.
- 교착 상태의 발생 빈도를 낮추기 위한 방법
- 트랜잭션을 자주 커밋한다.
- 정해진 순서로 테이블에 액세스한다.
- 필요 없는 경우에는 읽기 잠금 획득의 사용을 피한다.
- 쿼리에 의한 잠금 범위를 더 좁히거나 잠금 정도를 더 작은 것으로 한다.
- 한 테이블의 복수 행을 복수의 연결에서 순서 변경 없이 갱신하면 교착 상태가 발생하기 쉽다. 따라서 테이블 단위의 잠금을 획득해 갱신을 직렬화한다. (동시성은 떨어짐)
- 테이블에 적절한 인덱스를 추가해 쿼리가 이를 이용하게 한다.
하지 말아야하는 트랜잭션 종류
- 오토커밋 : 쿼리 단위로 커밋.
- 긴 트랜잭션 : 데이터베이스 트랜잭션의 동시성이나 자원의 유효성을 저하.
- 대량 처리를 한 개의 트랜잭션이 실행
- 아무것도 하지 않는 트랜잭션 유의
- 트랜잭션 중 대화처리
- 처리 능력 이상의 트랜잭션 수
'CS > Database' 카테고리의 다른 글
8장 ) 테이블 설계(1) (0) | 2021.11.28 |
---|---|
23,24강 ) 서브쿼리, 상관 서브쿼리 (0) | 2021.11.14 |
20-22강 ) 집계, 그룹화 (0) | 2021.11.06 |
6장 ) SQL문의 기본 : Select(2) (0) | 2021.11.06 |
16-19강 : 데이터의 추가, 삭제, 갱신 (0) | 2021.10.31 |