[F-Lab 챌린지 41일차 TIL]

성수데브리·2023년 8월 7일
0

f-lab_java

목록 보기
32/73

트랜잭션의 장점

하나의 단위로 묶인 작업들이 100% 적용되었거나 아무것도 적용되지 않음을 보장해주는 것이다.
트랜잭션 내 작업중 중간에 작업이 실패해도 이전에 성공한 작업들을 일일이 롤백하지 않아도 된다.

트랜잭션 경계설정 방법

  1. 코드에 의한 트랜잭션 경계설정
  2. 선언적 트랜잭션 경계 설정
    기존 코드에 영향을 주지 않으면서 간단한 설정으로 트랜잭션 경계를 설정할 수 있다.

트랜잭션 전파

트랜잭션 전파란 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다.

트랜잭션 전파 장점

선언적 트랜잭션의 장점은 여러 트랜잭션을 묶어서 커다란 트랜잭션 경계를 만들 수 있다는 것

  • REQUIRED : default
  • REQUIRES_NEW
  • MANDATORY
  • NOT_SUPPORTED
  • NEVER
  • NESTED

트랜잭션 격리수준: isolation

동시에 여러 트랜잭션이 진행될 때에 트랜잭션의 작업 결과를 여타 트랜잭션에게 어떻게 노출할 것인지를 결정하는 기준이다.

용어 정의

Dirty Reads
A dirty read occurs when a transaction reads data that has not yet been committed. For example, suppose transaction 1 updates a row. Transaction 2 reads the updated row before transaction 1 commits the update. If transaction 1 rolls back the change, transaction 2 will have read data that is considered never to have existed.

Nonrepeatable Reads
A nonrepeatable read occurs when a transaction reads the same row twice but gets different data each time. For example, suppose transaction 1 reads a row. Transaction 2 updates or deletes that row and commits the update or delete. If transaction 1 rereads the row, it retrieves different row values or discovers that the row has been deleted.

Phantoms
A phantom is a row that matches the search criteria but is not initially seen. For example, suppose transaction 1 reads a set of rows that satisfy some search criteria. Transaction 2 generates a new row (through either an update or an insert) that matches the search criteria for transaction 1. If transaction 1 reexecutes the statement that reads the rows, it gets a different set of rows.

  • DEFAULT : DB DRIVER 나 DB의 설정값을 따른다.

  • READ_UNCOMMITED : 가장 낮은 격리수준.

    • 하나의 트랜잭션이 커밋되기 전에 그 변화를 다른 트랜잭션에 그대로 노출되는 문제가 있음.
    • 하지만 가장 빠르다.
    • dirty reads ⭕, non-repeatable reads ⭕, phantom reads ⭕
  • READ_COMMITED

    • 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없다.
    • 하나의 트랜잭션이 읽은 데이터는 다른 트랜잭션에서 수정할 수 있다.
    • dirty reads ❌, non-repeatable reads ⭕, phantom reads ⭕
  • REPEATABLE_READ

    • 하나의 트랜잭션이 읽은 데이터를 다른 트랜잭션이 수정하는 것을 막아준다.
    • 하지만 로우 추가는 제한하지 않는다.
    • dirty reads ❌, non-repeatable reads ❌, phantom reads ⭕
  • SERIALIZABLE

    • 가장 강력한 트랜잭션 격리수준이다.
    • 이름 그대로 트랜잭션을 순차적으로 진행시킨다.
    • 트랜잭션이 동시에 같은 테이블의 정보에 엑세스하지 못한다.
    • 가장 안전하지만 가장 성능이 떨어진다.

    트랜잭션 롤백 예외

    • 스프링의 기본 동작 방식 :
      • 런타임 예외가 발생하면 커밋하고 이외의 체크 예외는 롤백한다. 체크 예외를 롤백하는 이유는 비즈니스 로직상 의미 있는 결과로 리턴하는 용도로 사용되는 경우가 많기 때문이다.
      • 그리고 스프링에서 데이터 엑세스 계층에서 예외가 발생하면 런타임 예외로 전환하기 때문에 롤백 대상으로 삼은 것이다.
    • 원한다면 기본 동작방식을 바꿀 수 있다.

0개의 댓글