ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션, 동시성
    Java/JPA 2020. 10. 25. 19:33

    트랜잭션

    애플리케이션의 기능이 수행되기 위해서는 동시에 여러 일을 처리해야 한다. 이러한 단계를 묶어 트랜잭션(작업 단위)라고 한다.

    트랜잭션의 작업 과정 중 하나의 과정이라도 실패하는 경우 전체의 작업 단위가 실패되어야 한다.

    이러한 특징을 원자성(automicity)라고 하는데 모든 연산(작업)이 하나의 원자 단위로 실행되어야 한다는 개념을 의미한다.

     

    트랜잭션은 흔히 'ACID'라고 하는 데이터의 일관성(consistency), 지속성(durability) 등의 네가지 보장해야 하는 속성이 있다.

    원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 하나의 작업인 것 처럼 모두 성공하거나 모두 실패해야 한다.
    일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터 베이스 상태를 유지해야 한다.
    격리성(Isolation): 도잇에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 한다.
    지속성(Durability): 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생하더라도 데이터 베이스 로그 등을 통해 성공한 트랜잭션의 내용을 복구할 수 있어야 한다.

     

     

    동시성 제어

    다중 사용자를 지원하는 데이터 베이스 시스템에서 동시에 실행되는 트랜잭션 간의 간섭(동일한 데이터에 대한 변경 작업)으로 인한 문제가 발생하지 않도록 트랜잭션의 실행 순서를 제어하는 기법을 의미한다.

     

    필요성

    하나의 데이터를 여러 트랜잭션들이 서로 간섭하면 갱신 분실(Lost Update), 연쇄 복귀 (Cascading Rollback), 회복 불가능(Unrecoverability), 불일치 분석(Inconsistent Analysis) 등과 같은 문제들이 발생한다.

    갱신 분실 (Lost Update): 트랜잭션들이 동시에 동일한 데이터를 수정할 때 발생하는 문제
    연쇄 복귀 (Cascading Rollback) / 회복 불가능 (Unrecoverability): 여러 트랜잭션이 데이터를 공유하는 상태에서 특정 트랜잭션을 rollback할 경우 문제 없는 다른 트랜잭션들까지 rollback 시키는 문제 (이 때, 한 트랜잭션이 완료된 상태인 경우 트랜잭션의 지속성 조건에 따라 rollback이 불가능)
    불일치 분석 (Inconsistent Analysis): 여러 트랜잭션이 동시에 실행될 때, 서로 끼어들기로 인해 트랜잭션의 일관성이 유지되지 못하는 문제

     

    동시성 제어는 위의 문제들을 방지하고 데이터의 무결성 및 일관성을 보장하기 위한 방법이다.

     

    잠금(Locking) 기법

    잠금은 하나의 트랜잭션이 실행되는 동안 특정 데이터 항목에 대해 다른 트랜잭션이 동시에 접근하지 못하도록 '상호 배제(Mutual Exclusive)' 기능을 제공하는 동시성 제어 기법이다.

    트랜잭션이 데이터에 대해 잠금(Lock)을 하면 해제(Unlock)하기 전까지 데이터를 독점하여 사용할 수 있다.

     

     

    동시성 제어 종류

    비관적(Pessimistic) 잠금

    여러 사용자들(여러 트랜잭션)이 같은 데이터를 동시에 수정할 것이라고 가정하고, 데이터를 읽는(Select) 시점에 Lock을 걸고 트랜잭션이 완료될 때 까지 이를 유지하는 것을 비관적 동시성 제어라 한다.

    데이터에 Lock을 걸게 되면 다른 트랜잭션이 이를 접근할 수 없기 때문에 Lock 기능을 잘못 사용하는 경우 심각한 성능 저하가 발생할 수 있다.

     

    낙관적(Optimistic) 잠금

    여러 사용자들이 같은 데이터를 동시에 수정하지 않을 것이라고 가정하고, 데이터를 읽을(Select) 때는 Lock을 걸지 않지만 수정(Update) 시점에 값의 변경 사항을 검사하여 상황에 따른 처리를 하는 것을 낙관적 동시성 제어라 한다.

     

     

     

    참고

    블로그-1

    블로그-2

    'Java > JPA' 카테고리의 다른 글

    격리 전략  (0) 2020.10.25
    영속성 컨텍스트  (0) 2020.10.23
    JPA(Java Persistence API)  (0) 2020.08.07
Designed by Tistory.