ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2021.08.07 기록장
    TIL 2021. 8. 6. 23:38

    ToDo

    • 알고리즘 문제
    • 책 읽기
    • 토비의 스프링
    • 7월 회고 쓰기

    Done

    • 토비의 스프링
    • 알고리즘 문제

    Weekly goal

    • 책 읽기
    • 토비 스프링 코딩

    토비의 스프링

     

    토비님은 트랜젝션이 기본 설정까지 설명해 주신다. 다른 책과 달리 굉장히 잘 설명되어있다.

     

    트랜잭션 전파와 격리 수준을 알아보자

     

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

    mysql은 디폴트 값이 Required인데 미리 시작된 트랜잭션이 있으면 참여하고 없으면 만든다.

    Requires_new는 항상 트랜잭션을 시작하는 것,

    nested는 new와 비슷한데 좀 다르다. 트랜잭션이 이미 중첩 트랜잭션을 시작한다. 이미 있는 트랜잭션 안에 새로운 트랜잭션을 만드는데 부모 트랜잭션이 롤백되면 같이 롤백되지만 자식 트랜잭션은 롤백돼도 부모는 커밋되면 그냥 간다.

     

    격리 수준은 여러 트랜잭션이 진행될 때 트랜잭션에 작업 결과를 다른 트랜잭션에게 어떻게 노출할지를 정하는 것이다.

    트랜잭션은 병렬적으로 실행된다고 볼 수 있다. 그렇기에 병행 제어가 필요하고 병행 제어 기법에는 락킹 등이 있다. 락을 거는 것인데 어쩔 때는 락을 이른 시간에 풀어서 문제가 될 수 있으므로 2단계 락킹 규약도 존재한다. 특정 시점에만 락을 걸고 특정 시점에만 락을 푸는 것이다. 이것으로 인해 동기화를 해줄 수 있다.

    말이 길어졌는데 격리 수준으로 넘어가면.

     

    read_uncommitted는 다른 트랜잭션이 커밋하지 않아도 변경된 내용을 참조할 수 있는 것이다. 성능은 빠르지만 데이터의 일관성이 떨어질 수 있다.

    read_committed는 가장 많이 사용되는 격리 수준으로 커밋하지 않은 정보는 참조 안 한다. 근데 다른 트랜잭션이 커밋해버리면 처음과 끝에 참조하는 정보가 다를 수 있다.

    repeatable_read는 하나의 트랜잭션이 읽은 로우를 다른 트랜잭션이 수정하는 것을 막아준다. 하지만 새로운 로우를 추가하는 것은 막지 않는다. 그래서 처음과 끝에 로우 수가 다를 수 있다.

    serializable은 가장 강력한 격리 수준으로 트랜잭션들을 순차적으로 실행시킨다. 그래서 성능이 많이 저하된다.

     

    329p.

    롤백

    선언적 트랜잭션에는 런타임 예외는 롤백시킨다. 그에 반해 체크 익셉션은 그냥 진행시킨다. try catch를 통해 비즈니스 의미 있는 return을 자주 해주기 때문이다.

     

    350p.

    저번에 말했듯이 spring은 2개의 컨텍스트로 이뤄진다. 루트 컨텍스트와 서블릿 애플리케이션 컨텍스트이다.

    루트는 비즈니스 서비스 계층과, 데이터 액세스 계층을 담고, 서블릿 애플리케이션 컨텍스트는 웹 관련 빈을 가지고 있다.

    이렇게 나눠진 이유는 스프링의 집착적인 대체 가능이다. 스프링 웹 서블릿 컨텍스트는 통째로 다른 기술로 변경될 수 있다.

    'TIL' 카테고리의 다른 글

    2021.08.09~11 기록장  (0) 2021.08.08
    2021.08.08 기록장  (0) 2021.08.07
    2021.08.06 기록장  (0) 2021.08.05
    2021.08.05 기록장  (0) 2021.08.04
    2021.08.04 기록장  (0) 2021.08.03

    댓글

Designed by Tistory.