Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Archives
Today
Total
관리 메뉴

개발자일기

DB 트랜잭션과 lock 본문

개발

DB 트랜잭션과 lock

ka0oll 2020. 5. 10. 22:40

트랜잭션이란?

데이터베이스의 상태를 변화시키기 일련의 작업 단위 또는 연산을 의미

 

트랜잭션 특성 ACID

원자성 ( Atomicity )
트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것을 말합니다.
즉, All or Noting의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미합니다.

 

일관성 ( Consistency )
트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지하는 것을 말합니다.
제약조건이 항상 유지 된다는 의미이다. 기본키, 외래키, 문자길이 같은 제약 사항들이 유지

 

격리성 ( Isolation )
트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것을 말합니다.
즉, 트랜잭션끼리는 서로를 간섭할 수 없습니다.

지속성 ( Durability )
성공적으로 수행된 트랜잭션은 영원히 반영이 되는 것을 말합니다.
commit을 하면 현재 상태는 영원히 보장됩니다.

 

트랜잭션 격리 레벨

ANSI표준 4단계가 존재한다.

 

READ UNCOMMITTED

다른 트랜잭션의 commit되지 않은 내용을 접근 가능하다. 즉 커밋되지 않은 데이터를 읽을 수있다.

발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read

 

READ COMMITTED

다른 트랜잭션에서 commit된 내용은 접근 가능하다. 

발생 문제점 : Non-Repeatable Read, Phantom Read

 

REPEATABLE READ

한 트랜잭션 내에서 한번 조회한 데이터는 같은 데이터가 조회된다.

발생 문제점 : Phantom Read -> 해당 트랜잭션에서 select에 잠금을 포함하면 undo영역에서 가지고 오지 못하게 되어, 다른 트랜잭션에서 의 결과가 반영된다.

 

SERIALIZABLE

shared lock(공유잠금)을 이용한 모든 select 조회

위의 3가지 레벨에서의 문제점 해결, 하지만 lock으로 동시성(속도가) 느리다. 

 

Dirty Read : 다른 트랜잭션에서 commit하지 않은 데이터를 읽는 것을 말한다.

Non-Repeatable Read : 한 트랜잭션에서 같은 쿼리에 대한 두번의 결과가 다른 트랜잭션이 값을 변경함으로써 두 쿼리 결과가 상이한것을 말한다.

Phantom Read : 한 트랜잭션에서 범위값을 다시 읽을때 첫번째 없는 결과가 두번째 쿼리에서 나타나는 현상

 

 

트랜잭션의 원리 (Mysql 기준)

Undo 영역 

트랜잭션이 롤백을 위해 백업해두는 영역이다.

기존데이터를 백업하고 실제 데이터를 변경한다. 롤백시 undo영역에서 데이터를 가지고와 원복한다.

발생된 트랜잭션의 번호도 함께 저장되어있다. 해당 데이터를 사용하는 트랜잭션이 없을 때까지 유지한다.

 

트랜잭션 마다 ID부여 자신의 트랜잭션 번호보다 낮은 undo영역의 값을 가지고 온다.

 

트랜잭션에 따른 lock (mysql기준)

읽기잠금, 공유락

select * from table LOCK IN SHARE MODE

다른 트랜잭션에서 읽기 잠금을 획득 할수 있지만, 쓰기잠금을 획득하려면 대기해야한다.

 

 

쓰기잠금, 베타적락

insert/update/delete 쿼리는 모두 기본적으로 쓰기 잠금,

select for update로 쓰기 잠금 획득

 

오해말기

해당 로우에 잠금이 걸렸다고, select가 안되는건 아님 잠금을 필요로한 select가 안되는것이다.

Comments