트랜잭션(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 동시성 저하

+ Recent posts