[Database] Transaction

DaeHoon·2023년 1월 2일
0

database

목록 보기
3/3

트랜잭션

  • 트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다.

트랜잭션 ACID

Atomicity (원자성)

  • Atomicity은 트랜잭션 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다.
  • 트랜잭션 커밋 중 에러가 발생했을 때 수행한 일을 다시 롤백한다. (All or Nothing)
  • 또한 트랜잭션 단위로 여러 로직을 묶을 때 외부 API를 호출하면 안된다. 만약 호출한다면 롤백이 일어났을 때 어떻게 해결 할지에 대한 해결이 있어야 한다. (트랜잭션 전파)

Consistency (일관성)

  • Consistency은 허용된 방식으로만 데이터를 변경해야 하는 것을 의미한다. 데이터베이스에 기록도니 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야 한다.
  • 예를들어 A는 1000만원 B는 0원이 있을 때 B가 A한테 돈을 입금을 할 수 없다. 돈이 없으면 입금을 할 수 없는 규칙이 있기 때문이다.

Isolation (격리성)

  • Isolation은 트랜잭션 수행 시 서로 끼어들지 못하는 것을 의미한다.
  • Isolation은 여러 개의 격리 수준으로 나뉘어 격리성을 보장한다.

격리 수준

  • SERIALIZABLE
    • 트랜잭션을 순차적으로 진행시킨다. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다. (격리성 강함, 동시성 약함)
    • 매우 엄격한 수준으로 해당 행에 대해 격리시키고, 이후 트랜잭션이 이 행에 대해 일어난다면 기다려야 한다.
    • 때문에 Deadlock이 일어날 확률도 가장 많고 성능이 떨어지는 격리 수준이다
  • REPEATABLE_READ
    • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다.
    • 트랜잭션 이후 추가된 행이 발견될 수 있다. (팬텀 리드 발생)
  • READ_COMMIT
    • 가장 많이 사용되는 격리 수준(MySql 8.0, PostgreSQL, SQL Server 오라클)
    • 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없음. 즉 커밋 완료된 데이터에 대해서만 조회를 허용한다.
    • 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있다. 예를 들어 트랜잭션 A가 수정한 행을 B가 수정할 수도 있다. 때문에 A가 같은 행을 다시 읽을 때 다른 내용이 발견될 수 있다. (팬텀 리드, 반복 가능하지 않은 조회 발생)
  • READ_UNCOMITED
    • 가장 낮은 격리 수준 (팬텀 리드, 반복 가능하지 않은 조회, 더티 리드 발생)
    • 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠름
    • 데이터 무결성을 위해 되도록이면 사용하지 않는 것이 좋으나, 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 어림잡아 집계하는 데는 사용하기 좋음.

격리 수준에 따라 발생하는 현상

  • Phantom Read (팬텀 리드)
    • 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
    • 예를 들어 사용자 A가 회원 테이블에서 age가 12 이상인 회원을 조회할 때 3개의 row가 조회된다고 가정해자. 그 다음 사용자 B가 15인 회원 레코드를 삽입한다. 그러면 그 다음 세 개가 아닌 네 개의 테이블이 조회된다.
  • non-repeatable-read (반복 가능하지 않은 조회)
    • 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우
    • 예를 들어 사용자 A가 큰 돌의 보석 개수가 100개라는 값을 가진 데이터를 불러오고, 그 이후 사용자 B가 그 값을 1로 변경했다면 A는 1을 읽게 된다.
    • 팬텀 리드와 다른 점은 반복 가능하지 않은 조회는 행 값이 달라질 수도 있는데, 팬텀 리드는 다른 행이 선택될 수도 있다는 것을 의미한다.
  • Dirty Read (더티 리드)
    • non-repeatable-read와 유사. 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만, 아직 커밋되지 않은 행의 데이터를 읽을 수 있을 때 발생한다.
    • 예를 들어 사용자 A가 큰 돌의 보석 개수가 100개라는 값을 1로 변경하고 커밋하지 않은 상태라도 다른 사용자들은 조회한 결과가 1로 나오는 경우를 말한다.

Durability (지속성)

  • Durability은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미한다.
  • 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 의미하며, 데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공한다.

무결성

  • 무결성이란 데이터베이스의 정확성, 일관성, 유효성을 유지하는 것을 말한다.
  • 무결성이 유지되어야 데이터베이스에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.
profile
평범한 백엔드 개발자

0개의 댓글