트랜잭션의 개념과 ACID 속성

‍bng4535·2023년 4월 3일
0

트랜잭션

  • 데이터베이스의 상태를 변경하는 하나의 논리적인 작업 단위
  • 논리적인 이유로 여러 SQL문을 단일 작업으로 묶어서 나눠질 수 없게 만든 것
  • 트랜잭션의 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.

COMMIT

  • 지금까지 작업한 내용을 DB에 영구적으로 저장
  • transaction을 종료

ROLLBACK

  • 지금까지 작업을 모두 취소하고 transcation 이전 상태로 되돌린다.
  • transcation을 종료

AUTOCOMMIT

  • 각각의 SQL문을 자동으로 transcation 처리 해주는 개념
  • SQL문이 성공적으로 실행하면 자동으로 COMMIT
  • 실행 중 문제가 있었다면 자동으로 ROLLBACK
  • MySQL의 default -> autocommit enabled
  • 다른 DBMS도 대부분 같은 기능 제공
  • START TRANSACTION 실행과 동시에 autocommit은 off
  • 트랜잭션이 종료되면 autocommit한 상태로 돌아간다

일반적인 트랜잭션 사용 패턴

  • 트랜잭션 시작
  • 데이터를 읽거나 쓰는 등의 SQL문을 포함해서 로직 수행
  • 과정에 문제가 없었다면 트랜잭션 COMMIT
  • 문제가 발생했다면 ROLLBACK
public void transfer(String fromId, String told, int amount){
	try{
    	Connection connection = ...;       // get DB connecction
        conmnection.setAutoCommit(false);  // means START TRANSACTION
        ...
        ...
    }catch (Exeption e){
    	...
        connection.rollback(); 
        ...
    }finally {
    	connection.setAutoCommit(true); 
    }
}

이러한 형태로 동작한다. 스프링에서는 사용자가 커넥션을 연결하고 commit 또는 rollback하는 것에 신경쓰지 않고 로직에 집중할 수 있도록 @Transactional을 지원한다.

@Transactional
public void transfer(String fromId, String told, int amount){
	... 
}

ACID

  • 트랜잭션이 지니는 성질
  • 개발자는 언제 commit, rollback 할지를 챙겨야 함

Atomic

  • All or NOTHING
  • 트랜잭션은 논리적으로 쪼깨질 수 없는 작업단위로, 모두 실패하거나 모두 성공해야 한다.

Consistency

  • 트랜잭션은 consistent한 상태에서 또다른 consistent상태로 바꿔주어야 한다.
  • constraint, trigger 등을 통해 DB에 정의된 rule을 위반하면 rollback해야 한다.
  • 이는 DBMS가 commit전에 확인하고 알려준다.

Isolation

  • 여러 transaction들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다.
  • isolation을 엄격하게 구현하면 DB성능이 저하되므로 여러 종류의 isolation level을 제공한다.
  • concurrency control의 주된 목표가 isolation이다.

Durability

  • commit된 transaction은 DB에 영구적으로 저장된다(비휘발성 메모리에 저장함).
  • DB에 문제가 생겨도 commit된 내용이 남아 있어야 한다.

참고 사항

  • transaction을 어떻게 정의해서 사용하는지는 개발자의 몫이므로 구현 기능와 ACID 속성을 잘 이해해야 한다.
profile
공부 기록

0개의 댓글