블로그

DBMS LOCK

Lock 이란?데이터베이스는 기본적으로 어려 유저가 사용하는 시스템으로써, 동시에 접근하는 경우가 많다. 저장된 데이터는 일관성, 무결성을 유지해야 하며, 동시에 접근하는 상황에서는 특별한 조치가 필요하다.예를 들어 콘서트 자리가 하나 남았는데 2명의 유저가 동시에 티켓팅을 할 경우 티켓팅 성공은 한 사람만 이뤄져야 한다. 이 특별한 조치를 DBMS에서 사용하는 방법이 바로 lock(잠금) 이다.즉, lock은 순차적인 접근을 위한 조치라고 볼 수 있다.Lock의 종류공유 잠금(Shared lock)a.k.a. 읽기 잠금배타 잠금(Exclusive lock)a.k.a 쓰기 잠금공유 잠금(Shared lock)데이터를 읽을 때 사용하는 잠금공유 잠금끼리 접근 가능공유 잠금이 설정된 데이터에는 배타 잠금 사용 불가즉, 공유 잠금이 설정된 경우 다른 세션이 동일한 데이터를 읽을 수 있지만 수정은 불가능배타 잠금(Exclusive lock)데이터 변경할 때 사용하는 잠금트렌젝션 완료까지 유지됨 잠금 해제하기 전까진 다른 트렌젝션 접근 불가즉 배타 잠금 설정 시 다른 세션이 동일한 데이터를 읽을 수도 없으며 수정 또한 불가능블로킹(Blocking)잠금들의 경합으로 인해 특정 세션이 작업을 진행하지 못하고 멈춘 상태공유 잠금 <-> 배타 잠금 / 배타 잠금 <-> 배타 잠금 간 발생 가능해결 방법으로는 이전 트렌젝션이 완료(commit or rollback)돼야 한다.기본적으로 발생 시 먼저 잠금 설정한 트렌젝션을 기다려야 한다. 반복 시 성능 저하 야기 가능하여, 최소화하는 작업이 필요최소화 방법SQL문을 리팩토링하여 빠르게 실행되게 한다.트렌젝션을 짧게 정의동일한 데이터를 변경하는 트렌젝션이 동시에 수행되지 않도록 방지트렌젝션이 활발한 주간에는 대용량 갱신 작업 X필수불가결 상황일 시, 트렌젝션 작업 단위를 나누거나 lock_timeout을 설정하여 최대 잠금 시간 설정교착 상태(Deadlock)여러 개의 트랜젝션들이 자신의 작업을 실행하지 못하고 상대의 작업이 끝나기를 무한정 기다리는 상태를 교착 상태라 한다. 해당 상태는 대표적인 lock의 부작용 사례라고 볼 수 있다. 위의 사진은 교착상태가 일어난 상황이다. 트렌젝션 A는 game_master 테이블의 2번 row를 변경한 후 game_detail의 2번 row를 변경하고자 한다. 반면 트렌젝션 B는 game_detail의 2번 row를 변경한 후 game_master의 2번 row를 변경하고자 한다. 이 상황에서 트렌젝션 A는 game_master의 2번 row에 lock을 걸었으며, 트렌젝션 B는 game_detail의 2번 row에 lock을 걸었다. 트렌젝션 A는 game_detail의 2번 row의 잠금이 풀릴 때 까지 대기해야 하며, 트렌젝션 B는 game_master의 2번 row의 잠금이 풀릴 때 까지 기다려야 한다.이때 서로가 먼저 끝나지 않으면 무한정 대기 상태에 빠지게 되며, 이게 바로 교착 상태(Deadlock)이다. 해결 방법트렌젝션 방향을 같게 설정한다.위의 사례를 예시로 보면, 트렌젝션 A의 접근 순서는 game_master -> game_detail이며, 트렌젝션 B의 순서는 game_detail -> game_master이다. 이때, 트렌젝션 B의 순서를 game_master -> game_detail로 바꿀 시, 교착 상태를 방지할 수 있다. 비록 이러한 상황에서는 블로킹 현상이 발생할 수 있지만, 교착 상태와 비교해서는 감안할 만한 문제이다. 트렌젝션 처리 속도 최소화 set_lock_timeout을 사용하여 잠금 해체 시간 조절무한정 대기에 빠지는 것을 방지한다출처데이터베이스 교착 상태(Dead Lock) : 네이버 블로그 (naver.com)[데이터베이스] 잠금이란? (tistory.com)  

데이터베이스locktransactionDBMSDeadlock

데이터베이스 1 - 개념, 특징, SQL, 조인, 부속질의, 인덱스, 저장프로그램 ...

출처 도서 - MySQL로 배우는 데이터베이스 이론과 실습 데이터베이스 데이터의 집합. 데이터 표준화를 통해 중복제거 등 데이터 무결성을 유지한다. 동시성 제어를 통해 데이터 일관성을 유지한다. 대용량 데이터 속에서 데이터 호출과 갱신의 효율성을 높인다. 하드디스크에 존재하며, 인덱스/데이터 사전 등으로 구성되어 있다.   DBMS(데이터베이스 관리 시스템) 데이터 정의, 구조, 값을 관리한다 <- 설계 과정 데이터는 DB에서, 데이터 구조는 DBMS에서 분리하여 관리하여 서로의 변화에 영향을 받지 않음 -> 데이터 독립성 데이터베이스를 관리하는 소프트웨어로 주기억장치에 상주 -> cpu, 메모리 소모 SQL 컴파일러, 트랜잭션/파일/버퍼 관리자 등으로 구성되어있다.   SQL(구조적 질의 언어) DDL : CREATE, ALTER, DROP DML : SELECT, INSERT, DELETE, UPDATE DCL : GRANT, REVOKE   데이터 모델 객체 관계 데이터 모델 : 객체 속성값(테이블 pk) 사용   테이블 속성 특징 원자성 : 단일값을 가진다. -> 취미라는 속성이 있다면, [독서, 운동] 값이 들어갈 수 있다.-> 두 가지 값을 넣고 싶다면, 취미1/취미2로 속성을 추가 및 분리해야한다. 도메인 값(타입)은 일정해야하며, 속성값의 이름은 중복되지 않아야한다 -> 데이터 표준화 및 일관성 확보 중복된 튜플은 존재하지 않는다. -> 보통은 auto increment int id를 pk로 구분시킴 기본키(primary key) : 튜플을 식별할 수 있는 후보키 중 선정된 대표키 외래키(foreign key) : 두 테이블을 연결하는 키;일대일관계에서는 주인(자주 사용하는 테이블)의 외래키에 주인이 아닌 테이블의 pk가 추가됨 일대다관계에서는 부모의 pk가 자식(주인)의 외래키에 추가됨 참조 무결성 제약조건 : restricted, cascade(같이 삭제), default, nullJPA에서는 생성 시에도 cascade 옵션을 통해 자식 테이블을 같이 생성 가능(save 메서드 없이도)   기본 SQLselectfrom    from - inner join - on    from - left join / right join - on    from - full joinwhere (between, in, like 와일드문자, and ...)group by - havingorder by 속성값 desc/asc 집계함수SUM, AVG, MIN, MAX, COUNT group by - having 사용 시 주의사항select 시 group by에서 사용한 속성값과 집계함수만 출력가능having 조건절에는 집계함수만 사용가능하다 - where 조건절과 구분하기   조인 일반조인from 테이블 나열 + where 조건절join + on 외부조인 outer join   부속질의대량데이터가 있을 경우, 모든 데이터를 합쳐서 연산하는 조인보다 성능이 좋음select, from, where 절에 추가적인 SQL문 추가exists 조건 사용하면 유용   내장함수ABS, CONCAT, LPAD(대체), SUBSTR, LENGTH, IFNULLADDDATE, DATE, DATEDIFF, DATE_FORMAT, STR_TO_DATE ...   뷰가상의 테이블; 기존의 테이블들을 가공하여 필요한 정보들만 출력CREATE VIEW 뷰이름 AS SELECT 문   인덱스하드디스크에서 데이터를 읽어오는 것은 액세스 시간이 소요되며이러한 연산속도를 개선하기 위해 인덱스를 활용인덱스를 중심으로 정렬하여 인덱스에 포함된 컬럼을 조건을 사용하여대용량 데이터 속에서 소량의 데이터를 호출할 때 빠르게 조회할 수 있음   저장 프로그램1. 프로시저 프로시저 생성CREATE PROCEDURE <이름>(<변수이름> <변수타입>, ...)BEGIN SET @<변수> = 0;DECLARE <변수이름> <변수타입>;...END 명령문DELIMITERIF THEN - ELSE - END IFLOOP | WHILE | REPEATRETURN 프로시저 호출CALL <프로시저 이름>(); 2. 함수프로시저는 CALL 명령어로 실행되는 프로그램이고, 함수는 Select문에 호출되어 값을 반환하는 용도로 사용CREATE FUNCTION <함수이름>(<변수이름> <변수타입>) RETURN INTBEGIN...END 3. 트리거CREATE TRIGGER ...INSERT DELETE UPDATE문과 함께 실행    

데이터베이스DBMSSQLtablefieldkey조인