[66해빗 페이백 챌린지] 21일차

tree·2023년 5월 22일
0

트랜잭션 - DB 예제1 - 개념 이해

  • 트랜잭션 사용법

    • 데이터 변경 쿼리(등록, 수정, 삭제) 실행 후 변경 데이터를 DB에 반영하려면 커밋 호출, 반영하지 않으려면 롤백 호출
    • 커밋을 호출하기 전까지는 임시로 데이터를 저장
      - 트랜잭션을 시작한 세션을 임시 데이터 확인 가능
      - select 쿼리로 조회 가능
      - 다른 세션은 임시 데이터 확인 불가능
  • 만약 커밋하지 않은 데이터를 다른 세션에서 조회가 가능하면 어떤 문제가 발생할까?

    • 다른 세션에서 임시 데이터를 기반으로 로직을 수행할 수 있다.
      • 만약 트랜잭션을 시작한 세션에서 커밋하지 않으면 데이터 정합성에 문제가 발생한다.
      • 위의 그림에서 세션2가 신규 회원1에게 송금했는데 임시 데이터가 롤백된다면?

트랜잭션 - DB 예제2 - 자동 커밋, 수동 커밋

  • 자동 커밋
    • 자동 커밋으로 설정하면 쿼리 실행 직후 커밋을 호출.
    • set autocommit = true;
  • 수동 커밋
    • set autocommit = false;
    • 보통 자동 커밋 모드가 기본인 경우가 많기 때문에 수동 커밋으로 설정하는 것을 트랜잭션을 시작한다고 표현한다.
    • 꼭 commit 또는 rollback을 호출해 트랜잭션 결과를 DB에 반영할지 말지 결정해야 한다.
  • 커밋 모드는 한번 설정하면 해당 세션에서는 계속 유지된다.

트랜잭션 - DB 예제3 - 트랜잭션 실습

  • 생략

트랜잭션 - DB 예제4 - 계좌이체

  • 오토 커밋의 문제점
    • 원자적으로 처리해야 할 작업들을 원자적으로 처리할 수 없다.
      • 오토 커밋 모드에서 계좌 이체 작업을 하는데 송금 계좌의 잔액을 차감하는 작업은 성공했지만 수금하는 계좌의 잔액을 증액하는 작업은 실패했다고 가정해보자. 오토 커밋 모드는 하나의 쿼리가 끝날 때마다 커밋하기 때문에 송금 계좌의 잔액만 차감된 상태로 계좌 이체 작업이 끝나게 된다.

DB 락 - 개념 이해

  • 격리성
    • 서로 다른 세션의 트랜잭션들이 동시에 같은 데이터를 수정하려고 하면 격리성이 깨진다.
  • 락 획득과 반납
    • 세션이 트랜잭션을 시작하고 데이터를 수정한 후 커밋 또는 롤백을 호출할 때까지 변경하려는 로우의 락을 획득하여 다른 세션이 해당 데이터를 수정할 수 없도록 해야 한다.
      • 커밋 또는 롤백을 호출하면 락을 반납해 다른 세션이 락을 획득할 수 있다.
      • 락을 획득하지 못한 세션은 락을 가지고 있는 세션이 락을 반납할 때까지 대기한다.
        • 무한정 대기하지는 않고 정해진 대기 시간만큼 대기한다.
          • set LOCK_TIMEOUT = 60000
            • 60초 대기(60초 지나면 락 타임아웃 오류)

DB 락 - 변경

  • 실습이므로 생략

DB 락 - 조회

  • 조회 시 락은 불필요
    • DB마다 다르지만, 보통은 데이터 조회 시에는 락을 획득하지 않아도 데이터를 조회할 수 있다.
  • select for update 문
    • 경우에 따라 데이터 조회 시에도 락을 획득해 다른 세션이 데이터를 수정하는 것을 막을 필요가 있다.
    • select for update문을 사용하면 락을 획득하여 데이터를 조회
  select * from member where member_id = 'memberA' for update;

0개의 댓글