💻 Computer Science/데이터베이스

MySQL 잘 사용하기 (1)

an2z 2023. 2. 10. 21:58

트랜잭션 (Transaction)

트랜잭션이란 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.

  • 작업의 완전성 보장
  • 사용자의 작업셋을 모두 완벽하게 처리(커밋)하거나 처리하지 못하면 원상태로 복구(롤백)

 

 

MySQL 스토리지 엔진

SQL 엔진 vs 스토리지 엔진

  • MyISAM
  • InnoDB
  • memory

InnoDB

요즘은 다 InnoDB를 사용하는 추세이다.

  • 트랜잭션 지원
  • FK → 관계형 데이터 베이스 사용 가능
  • 버퍼링 : 작업을 Buffer pool에 쌓아두었다가 한번에 처리

 

 

Database Lock

Lock 단어 그대로 "잠금"의 의미를 갖는다.

하나의 데이터를 동시에 여러 명이 조작할 수 없도록 잠그는 것으로, 동시성(concurrency)를 보장한다.

MySQL 엔진락과 InnoDB락이 있다.

 

MySQL 엔진 락

  • 글로벌 락 : 전반적인 모든 조작을 멈춤
  • 테이블 락
    • 하나의 테이블을 대상으로 조작을 멈춤 
    • Read Lock : 데이터를 읽으려고 하니까 입력하지 못하도록 락을 걸음 → INSERT 안됨
    • Write Lock  : 데이터를 쓰려고 하니까 읽지못하도록 락을 걸음 → SELECT 불가
  • 네임드 락 : 임의로 시간동안 조작 권한을 갖는 락을 획득
  • 메타데이터 락

 

InnoDB의 락 종류

  • 레코드 락 : 테이블의 row을 대상으로 락을 걸음
  • Auto Increment :

 

데드락?

데르락이란 락이 죽은 것을 의미한다.

릴리즈가 잘 처리되지 않아 이미 연결이 끊겼음에도 락이 유지되고 있는 듯이 제한이 풀리지 않는다고 생각하면 된다.

락이 죽으면 데이터에 접근하기 위해 락이 릴리즈 될 때까지 하염없이 기다리기 때문에 데이터베이스 성능 저하 문제가 발생한다.

 

 

격리 수준 (Isolation Level)

  • Read Uncommitted : 커밋되지 않을 것을 읽을 수 있다.
  • Read Committed : 커밋된 것을 읽을 수 있다.
  • Repeatable Read (default) : 계속 읽을 수 있다.
  • Serializable : 트랜잭션간 완전히 격리한다.

 

Read Uncommitted

📌 터미널1

-- 1. 오토커밋 해제 및 격리수준 변경
set @@autocommit=0;
SELECT @@autocommit;
set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT @@transaction_isolation;

-- 4. 트랜잭션 시작하고 데이터 삽입
start transaction;
INSERT into test_table (id) values (123);

-- 6. 데이터 조회 (삽입한 데이터 보임)
SELECT * FROM test_table;

-- 7. 커밋 안하고 되돌리기로 마무리
rollback;

📌 터미널2

-- 2. 격리수준 변경
set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT @@transaction_isolation;

-- 3. 데이터 조회 (터미널1에서 트랜잭션 시작 전)
SELECT * FROM test_table;

-- 5. 데이터 조회 (터미널1에서 삽입한 커밋전의 데이터가 보임)
SELECT * FROM test_table;