책/real mysql

트랜잭션과 잠금

ballde 2021. 12. 27. 19:13

트랜잭션이란?

트랜잭션은 작업의 완전성을 보장해 주는 것이다.

즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 하는 기능!!!

잠금 vs 트랜잭션

잠금 - 동시성을 제어하기 위한 기능

트랜잭션 - 데이터의 정합성을 보장하기 위한 기능

 

트랜잭션 정의와 특징

db의 상태를 변화시키기 위해 수행하는 단위 그리고 하나의 트랜잭션은 commit 되거나 rollback 되거나 합니다.

트랜잭션의 특징(ACID)

atomicity(원자성) - 트랜잭션 연산은 모두 반영되던가 전혀 반영이 되지 않아야한다.

consistency(일관성) - 성공적으로 완료하면 일관성 있는 데이터 베이스 상태로 변환

isolation(격리성) - 둘 이상의 트랜잭션이 동시에 실행되는 경우 다른 트랜잭션의 연산이 끼어 들 수 없음

Durability( - 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영

주의

1. Transactional 어노테이션을 같은 클래스에서 호출하는 경우?

       a. 같은 클래스내에 트랜잭션이 없는 곳에서 트랜잭션이 있는 곳을 호출하면 작동하지 않음

        ⇒ transactional은 proxy 기반이고 AOP로 구성되어 있다. 그래서 method / class 가 실행되기 전 / 후 단계에서 자동으로 트랜잭.         션을 묶는다.(스프링에서는 @transactional은 인스턴스에서 처음으로 호출하는 메서드나 클래스의 속성을 따라가게됨)

2. Transactional 어노테이션이 Checked Exception과 Unchecked Exception에서 어떻게 동작하는지

  • 아무것도 없을 경우에 아래와 같이 인식
@Transactional(rollbackFor = {RuntimeException.class,Error.class})

 

innodb vs MyISAM

오류 발생 시

innodb - 트랜잭션 O - 롤백

MyISAM - 트랜잭션 X - 롤백 X - 실패에 대한 재처리 작업이 필요 ...

예전에는 트랜잭션이 싫어서 MyISAM을 했다는데 잘 모르겠다...

주의사항

트랜잭션 또한 DBMS 커넥션과 동일하게 꼭 필요한 코드에만 적용하는게 좋음

Mysql 엔진의 잠금

스토리지 엔진 레벨 vs mysql 엔진 레벨

  • mysql 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향이 간다
  • 스토리지 엔진 레벨의 잠금은 스토리지 엔진 각 상호 영향을 미치지 않는다

글로벌 락

  • FLUSH TABLES WITH READ LOCK 명령으로 획득 가능
  • 글로벌 락이 미치는 범위는 mysql 서버 전체
  • FLUSH TABLES WITH READ LOCK 명령이 실행되기 전에 테이블이나 레코드에 쓰기 잠금을 걸고 있는 sql이 실행되고 있었다면 읽기 잠금을 걸기 위해 먼저 실행된 sql이 완료 되고 실행됨
  • ⇒ 즉 쿼리가 완료돼야만 테이블을 플러시하고 잠금을 걸 수 있다.

잠금 튜닝

show status LIKE 'Table%'

  • table_locks_immediate - 다른 잠금 이 풀리기를 기다리지 않고 바로 잠금을 획득한 횟수
  • table locks_watited - 다른 잠금이 이미 해당 테이블을 사용하고 있어서 기다려야했던 횟수를 누적해서 저장
  • 만약 이 수치가 높고 경합(lock connection)이 많이 발생하고 있다면 테이블 분리 또는 innoDB 스토리지 엔진으로 변환

테이블 수준의 잠금 확인 및 해제

  • lock tables 명령을 이용해 명시적으로 획득
  • ddl 명령과 같은 쿼리 문장을 이용해 묵시적으로 획득하는 방법

InnoDB 스토리지 엔진의 잠금

  • 레코드 기반 잠금 방식 - 뛰어난 동시성 처리 제공 - 하지만 mysql 명령을 통해 접근하기가 까다로움

' > real mysql' 카테고리의 다른 글

드라이빙 테이블 - 드리븐 테이블  (0) 2022.01.12
5. 인덱스(2) - 그외 인덱스  (0) 2021.12.30
5장. 인덱스  (0) 2021.12.30
트랜잭션 격리 수준  (0) 2021.12.27
mysql 아키텍처  (0) 2021.12.21