Replies: 4 comments
-
1. 트랜잭션이란?한 덩어리의 쿼리 처리 단위를 트랜잭션이라고 한다. 트랜잭션은 다음 네 가지의 특성으로 정의된다.
1-1. 원자성변경을 수반하는 일련의 데이터 조작이 전부 성공할지 전부 실패할지를 보증하는 구조. 1-2. 일관성일련의 데이터 조작 전후에 그 상태를 유지하는 것을 보증하는 구조. 1-3. 격리성일련의 데이터 조작을 복수 사용자가 동시에 실행해도 '각각의 처리가 모순없이 실행되는 것을 보증한다'는 것. 이를 보증하기 위해 DB에서는 DB 오브젝트인 테이블에 대해 잠금을 걸어서 후속처리를 블록하는 방법이 있다. 그렇다면 어떤 상태가 모순이 없다고 할 수 있을까? 바로 복수의 트랜잭션이 순서대로 실행되는 경우와 같은 결과를 얻을 수 있는 상태를 의미한다. 이것을 DBMS에서 격리 수준으로 구현하고 제공하는 것이 Serializable이라는 사양이다. Serializable이 보장되면 모순이 없는 상태가 만들어지기 훨씬 쉽겠지만, 성능면에선 결코 실용적이지 않다. 따라서 격리 수준을 네 단계로 나누는 것을 ANSI라는 규격 단체에서 정의했다.
격리 수준에 따라 발생할 수 있는 이상 현상은 아래와 같다.
1-4. 지속성시스템이 정상일 때만이 아니라 DB나 OS의 이상 종료, 즉 시스템 장애도 견딜 수 있다는 것을 의미한다. 많은 DB 구현에서는 트랜잭션 조작을 HDD에 "로그"로 기록하고 시스템에 이상이 발생하면 그 로그를 사용하여 이상 발생 전의 상태까지 복원하는 것으로 지속성을 실현하고 있다. 2. 다른 커넥션에서 테이블을 본다?기본적으로 DDL과 DML에 의한 데이터 저장은 트랜잭션이 커밋되기 전까지는 다른 커넥션에서 보이지 않는다. 하지만
3. 트랜잭션 격리 수준에 따른 외관상의 차이MySQL은 MVCC라는 기술을 사용하기 때문에 아래의 특징을 갖는다.
4. 잠금 타임아웃과 교착 상태가 발생하는 이유잠금 타임아웃이란?갱신과 참조는 서로를 block 하지 않지만, 갱신과 갱신이 부딪치는 경우에는 나중에 온 갱신이 잠금 대기 상태가 된다. 잠금 대기로 타임아웃이 발생하는 경우 DBMS로부터 롤백되는 단위가 다를 때가 있는데, 해당 트랜잭션 전체를 롤백하는 경우와 쿼리만 롤백하는 것이다.
교착상태란?잠금을 유지한 채 서로 잠금을 건 자원에 잠금이 필요한 처리를 실행하면 아무리 기다려도 상황이 바뀌지 않는 상태가 된다. 이것이 바로 교착상태이다. MySQL은 교착 상태가 일어나면 이를 즉시 인식해 시스템에 영향이 작은 쪽의 트랜잭션을 트랜잭션 개시 시점까지 롤백한다. 교착상태 빈도 낮추는 대책교착 상태는 완벽하게 없앨 수는 없다. 따라서 어플리케이션 쪽에서는 항상 트랜잭션이 교착 상태를 일으켜 롤백되는 경우에 트랜잭션을 재실행할 수 있는 구조로 만들어야 한다. DBMS 전반적인 대책
MySQL의 대책
5. 해서는 안되는 트랜잭션 처리1. 오토커밋오토커밋이란 쿼리 단위로 커밋하는 설정이다. 2. 긴 트랜잭션DB 트랜잭션의 동시성이나 자원의 유효성을 저하한다. |
Beta Was this translation helpful? Give feedback.
-
7장트랜잭션과 동시성 제어
트랜잭션의 특성 : ACID
다른 커넥션에서 테이블을 보는 경우
하는 방법이 있는데, 이 때 a를 오토 커밋이라 한다. mysql 등은 기본적으로 오토 커밋이 기본 설정이다. 트랜잭션 격리 수준에 따른 외관상 차이MVCC에 따른 MySql의 특성
트랜잭션 격리 수준별 외관
반복 읽기
커밋된 읽기
커밋되지 않는 읽기가 사용되지 않는 이유
잠금 타임아웃과 교착 상태잠금 타임아웃
교착 상태
교착상태 피하기
해서는 안 되는 트랜잭션 처리
|
Beta Was this translation helpful? Give feedback.
-
7장 트랜잭션과 동시성 제어💡목표복수의 쿼리를 통합하는 과정에서 데이터의 정합성을 가지기 위해 트랜잭션과 동시성 제어에 대해 학습한다. 트랜잭션
Atomicity(원자성)
Consistency(일관성)
Isolation(고립성)
Durability(지속성)
다른 커넥션에서 테이블을 본다.
트랜잭션 격리 수준에 따른 외관상 차이
잠금 타임아웃과 교착 상태
교착상태의 빈도를 낮추기 위한 사항
해서는 안 되는 트랜잭션 처리
|
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.


Uh oh!
There was an error while loading. Please reload this page.
-
트랜잭션과 동시성 제어
트랜잭션이란
ACID
ACID는 다음의 단어의 앞 글자들을 따온 것이다.
Atomicity, 원자성
Consistency, 일관성
Isolation, 고립성(격리성)
일련의 데이터 조작을 복수 사용자가 동시에 실행해도 각각의 처리가 모순없이 실행되는 것을 보증한다.
격리성 없이 진행되면 이런 사태가 발생할 수 있음
만약 부산 호텔에 남은 방이 10개 있을 때의 예약 흐름
이런 사태를 방지하기 위해 DB에서는 오브젝트인 테이블에 대해 잠금(Lock)을 걸어 후속 처리를 블록(Block)할 수 있음
잠금 단위는 테이블 전체, 블록, 행 등이 있는데 MySQL에선 트랜잭션 처리를 할 때 주로 행 단위의 잠금이 이용됨
사용자 A가 1번의 과정을 처리할 때 SELECT ~ FOR UPDATE구문을 통해 방 수에 대해 잠금을 걸어두면 사용자 B는 A의 처리가 끝나 잠금을 획득할 때까지 대기하게 되며, 이렇게 하여 정상적인 방 수를 갱신할 수 있게 된다.
또한, InnoDB의 경우에는 MVCC 구조로 동작하기 때문에 단순 값 참조의 경우엔 SELECT FOR UPDATE는 불필요하며 읽기는 블록되지 않는다. 테이블을 갱신하는 사용자가 소수고 참조하는 사용자가 많은 경우엔 사용자의 동시성, 병렬성이 높아진다.
격리성에는 여러 레벨이 존재하는데 ANSI에서 제시한 4개의 단계는 아래와 같다.
직렬화 가능이 가장 엄격하며 숫자가 작아질수록 완화된다.
격리 수준에 따라 3 가지의 데이터 부정합이 발생할 수 있고, 다음과 같다.
Durability, 지속성
어떤것들은 다른 커넥션에서 왜 바로 보일까
MySQL이나 Oracle에서는 CREATE TABLE과 같은 DDL 실행 시 암묵적인 커밋이 발행한다. 이 때문에 한 개의 커넥션에서 실행된 CREATE TABLE이 성공하면 그 이후에 다른 커넥션에서도 참조할 수 있게 된다.
트랜잭션의 개시 (BEGIN TRANSACTION, START TRANSACTION, SET TRANSACTION 등)가 명시적으로 지정되지 않았을 때 트랜잭션을 구별하는 방법은 2가지가 있다.
하나의 SQL 문이 하나의 트랜잭션으로 구분됨 -> 이것이 오토 커밋 모드
사용자가 COMMIT 또는 ROLLBACK을 실행하기까지가 하나의 트랜잭션이 된다.
MySQL, PostgresSQL, SQL Server는 기본적으로 오토 커밋 모드로 되어있고 끌 수 있다.
MVCC(Multi Versioning Concurrency Control)
잠금 타임 아웃됨잠금 타임아웃&교착 상태
잠금 타임아웃
교착 상태
해서는 안 되는 트랜잭션 처리
Beta Was this translation helpful? Give feedback.
All reactions