트랜잭션(Transaction)
- 데이터베이스 상태를 변화시키기 위해 수행하는 작업 단위
- 작업의 완전성을 보장해준다.
- 상태 변화 : SQL query를 통해 DB에 접근(SELECT, INSERT, DELETE, UPDATE)
- 작업 단위 : 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것
- ex. A 사용자가 B 사용자 에게 x원 송금
- A 계좌에서 - (x원) UPDATE
- B 계좌에서 + (x원) UPDATE
- 현재 작업 단위(트랜잭션) : + UPDATE, - UPDATE
- Commit : 두 쿼리문이 모두 성공되면 하나의 작업 완료
- Rollback : 하나라도 실패시, 모든 쿼리문을 취소하고 이전 상태로 돌려놓기
트랜잭션, Lock
- Lock : 동시성을 제어하기 위한 기능
- 여러 곳에서 동시에 동일한 자원을 요청할 때, 하나의 커넥션만 변경할 수 있도록 해준다.
- 트랜잭션 : 데이터의 정합성을 보장하는 기능
- 하나라도 실패하면 적용되지 않도록 보장
트랙잭션의 특성 - ACID
(1) Atomicity(원자성)
- All or nothing
- 모든 작업이 완료되거나 실행이 아무것도 되지 않아야 한다.
(2) Consistency(일관성)
- 트랜잭션이 끝난 후, 결과가 제약조건에 위배 되지 않는 상태(correct state)이 된다.
(3) Isolation(독립성)
- 모든 트랜잭션이 다른 트랜잭션에 독립적이다.
- Thread 동기화 처리와 일치한다.
(4) Durability(지속성)
- 트랜잭션 성공적으로 종료 시, 해당 결과가 2차 저장소에 영구적으로 저장된다.
트랜잭션 사용 주의사항
- 꼭 필요한 최소의 코드에만 적용한다. = 트랜잭션 범위 최소화
- 각 단위 프로그램의 커넥션 소유 시간이 길어지면, 다른 프로그램에서 커넥션을 가져가게 되면 대기 시간이 길어질 수 있다.
트랜잭션 격리 수준(Transaction Isolation Level)
- 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준
- 데이터베이스는 ACID의 특징처럼, 트랜잭션은 독립적인 수행이 이루어져야 한다.
- Locking을 통해, 하나의 트랜잭션에 다른 트랜잭션이 관여하지 못하도록 막을 수 있다.
- 하지만, Locking은 데이터 베이스의 성능을 저하시킬 수 있는 단점이 있다. -> 효율적인 Locking 필요
Isolation level
- level 0 : 트랜잭션이 처리중이거나, 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것 허용
- level 1 : commit이 이루어진 트랜잭션만 조회 가능 (대부분 SQL server의 default)
- level 2 : 트랜잭션이 완료되기 전까지 다른 사용자는 데이터 수정 불가능 (MySQL default)
- level 3 : 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능
교착상태
- 2개 이상의 트랜잭션이 특정 자원의 lock을 획득한 채 다른 트랜잭션이 소유하고 있는 lock을 요구하면 계속 기다려도 상황이 바뀌지 않는 상태
- 교착 상태의 빈도를 낮추는 방법
- 트랜잭션을 자주 커밋한다.
- 정해진 순서로 테이블에 접근
- 읽기 잠금 획득(SELECT ~ FOR UPDATE) 사용 피하기
- 한 테이블의 복수 행을 복수의 연결에서 순서 없이 갱신하면 교착상태 발생
- 테이블 단위의 잠금으로 갱신을 직렬화 한다. but 동시성 저하
'CS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] KEY - 후보키, 외래키, 기본키, 슈퍼키, 대리키 (1) | 2022.09.30 |
---|---|
[데이터베이스] SQL vs NoSQL (1) | 2022.09.30 |
[데이터베이스] 정규화 Normalization (0) | 2022.09.30 |
[데이터베이스] 인덱스 Index, B tree (0) | 2022.09.30 |
[데이터베이스] 데이터베이스 특징 - 무결성, 독립성, 보안성, 중복 최소화, 일관성 (0) | 2022.09.30 |