트랜잭션이란?
트랜잭션은 작업의 완전성을 보장해 주는 것이다.
즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 하는 기능!!!
잠금 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 |