DB
Transaction
- 트랜잭션은 Database의 데이터를 조작하는 작업의 단위
A가 B에세 1,000원을 송금한다고 가정했을시 시나리오는 다음과 같습니다.
- A의 계좌에서 1,000원을 차감
- B의 계좌에 1,000원을 추가
만약 이때 B의 계좌를 관리하는 은행에서 이유를 알수없는 오류로 추가가 되지 않는다면 A의 계좌에서 돈만 차감되게 되어 장애로 연결이 됩니다. 이를 보장하기 위해서 모든 작업들은 트랜잭션 단위로 묶어서 처리를 해야합니다.
- A.C.I.D
- Atomicity : 원자성, 일부만 실행되거나 중단되지 않는다.
- Consistency : 일관성, 이전과 같은 상태를 유지한다. (정수타입에 문자열이 들어가지 못하는것을 보장한다거나..)
- Isolation : 격리성, 다른 작업이 끼어들지 못하게 보장해준다.
원칙적으로 서로 간섭할 수 없어야 하지만, 성능 이슈들이 많아 유연하게 설정이 가능한 제약조건 - Durability : 지속성, 성공적으로 수행된 트랙잭션은 영구히 반영되어야한다.
Isolation Level
- 트랜잭션 격리 수준
- 동시에 여러 트랜잭션이 처리될 때, 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것.
종류
- READ UNCOMMITED
- COMMIT 이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 값을 읽을 수 있다.
- 정합성에 문제가 많아 사용하지 않는것을 권장한다.
- DIRTY READ 현상 발생
- 트랜잭션 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있어 잘못된 정보로 조회될 수 있다.
- READ COMMITED
- COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있다.
- COMMIT 되지 않은 값은 실제 테이블 값을 가져오는것이 아니라 Undo 영역에 백업된 레코드 값을 가져온다.
- RDB에서 대부분 기본적으로 사용되고 있는 격리수준 (오라클 등)
- NON-REPEATABLE READ 문제가 발생
- 한 트랜잭션안에서 동일 데이터를 조회할 때, 다른 조회결과가 나올 수 있다. (중간에 COMMIT이 되면)
- COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있다.
- REPEATABLE READ
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있다.
- 트랜잭션마다 트랜잭션 ID를 부여, 현재 트랜잭션 ID보다 작은 트랜잭션 ID에서 변경한것만 읽게 된다.
- 한 트랜잭션의 실행시간이 길어질수록 해당 시간만큼 계속 멀티 버전을 관리해야 한다.(Undo 공간에 백업해둔다.)
- 실제로 영향을 미칠 정도로 오래 지속되는 경우는 드물어 READ COMMITED와 성능차이는 거의 없다.
- 한 트랜잭션 안에서 반복해서 SELECT를 수행하더라도 읽어 들이는 값이 변화하지 않음을 보장합니다.
- MySQL에서 기본으로 사용하고 있다.
- PHANTOM READ 발생
- 이 후 트랜잭션에서 UPDATE는 방지되지만, INSERT는 바로 반영되어 처음에 없던 데이터가 이후 조회시에는 나타날 수 있다.
- 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있다.
- SERIALIZABLE
- 가장 단순하고 엄격한 격리수준
- 성능층면에서는 동시 처리 성능이 가장 낮다.
- 읽기 작업에도 공유잠금을 설정하여, 다른 트랜잭션에서 접근이 못하게 한다.
- DEAD LOCK에 걸리지 않게 신중하게 사용해야한다.
S Lock : ( Shared lock, 공유 잠금 )
읽기 잠금(Read lock)이라고도 불린다.
쉽게 말해 리소스를 다른 사용자가 동시에 읽을 수 있게 하되 변경은 불가하게 하는 것이다.
- 어떤 자원에 shared lock이 동시에 여러개 적용될 수 있다.
- 어떤 자원에 shared lock이 하나라도 걸려있으면 exclusive lock을 걸 수 없다.
X Lock : ( Exclusive lock, 배타적 잠금 )
쓰기 잠금(Write lock)이라고도 불린다.
어떤 트랜잭션에서 데이터를 변경하고자 할 때(ex . 쓰고자 할 때) 해당 트랜잭션이 완료될 때까지 해당 테이블 혹은 레코드(row)를 다른 트랜잭션에서 읽거나 쓰지 못하게 하기 위해 Exclusive lock을 걸고 트랜잭션을 진행시키는 것이다.
- exclusive lock에 걸리면 shared lock을 걸 수 없다. (shared lock은 아래에서 설명)
- exclusive lock에 걸린 테이블,레코드등의 자원에 대해 다른 트랜잭션이 exclusive lock을 걸 수 없다.
RX, RS, S, SRX, X등 다양한 Lock이 존재.
- 각 레벨의 문제점