하나의 흐름을 안전하게 처리하도록 보장
하나의 거래를 안전하게 처리하게 보장?
EX) 은행거래!
5000원 계좌 이체
A의 잔고를 5000원 감소 B의 잔고를 5000원 증가
2가지 작업이 합쳐서 하나의 작업처럼 안전하게 동작해야하는 것 처럼..
- 하나의 거래를 안전하게 처리해 준다는 뜻으로 시작하자
정상반영 : 커밋 실패: 롤백!
원자성, 일관성, 격리성, 지속성.. 항상 나오는 문장 ! 외우기가 어렵
이 부분도 매일 까먹는다.
일반적으론 커밋된 읽기 많이 쓰는듯?
각 격리 수준의 자세한 설명
항상 정리를 하지만 공부할 때만 외우고 또 잊어버린다. 반복적으로 봐야지
한 트랜잭션이 동일한 쿼리를 두 번 실행했을 때, 첫 번째 쿼리와 두 번째 쿼리의 결과가 다른 경우 발생
결국 내가 이해한건 2~3번 격리수준 에서.
데이터를 조회할때 커밋된 사항만 봐야되는대 (일관적, 멱등성?)
만약 다른 트랜잭션에서 새로운데이터가 삽입 수정 삭제 된다면
일관성이 깨진다는 것 . 더 자세히 설명하면
트랜잭션이 시작할때 데이터에 대한 일관성을 보장
즉 한 트랜잭션 내에서 동일한 쿼리 반복해도 트랜잭선 시작이후 (수정 ,삭제 방지)
허나 다른 트랜잭션에서 삽입이 일어날시 팬텀리드 현상 발생
이 격리수준의 목적은 일관되지않는 읽기를 방지하는 것 이다.!
반복 불가능한 읽기? 일관되지 않는 읽기? 영어 어렵네
Non-repeatable reads? 이렇게 이해하면 되나?
일관적인 데이터를 계속 보장한다고 한다.
수정, 삭제에 영향을 받지 않음.
처음에 잘못 이해해서 삽질을 했내 처음 이해한건 영향을받지 않는다 로 해서
많이 헷갈렸다.
결론적으론 조회한 행데이터는 다른 트랜잭션에서 수정 삭제 시도 할 때
이를 방지하는 블록을 사용해 데이터 일관성 유지. (읽기 잠금)
이는 트랜잭션이 완료될 때 까지 유지
왜? 일관성과 격리를 보장해야 되기 때문 맨위에 ACID
일반적으로 SELECT 는 락을 사용하지 않음
데이터를 조회하는데 락을 걸고 싶을때가 있다. (select for update) 사용
왜 이런걸 사용할 때가? 다른 곳에서 변경하지 못하도록 강제로 막아야 될때
돈 관련 로직? 중요한거? 적절한 예시가없네
트랜잭션 프록시는 원본 객체(대상 객체)를 대신하여 트랜잭션 관리 코드를 실행하는 임시 객체.
스프링이 @Transactional 애노테이션이 붙은 클래스나 메서드를 처리할 때, 원본 객체 대신 프록시 객체를 생성하고 이 프록시를 스프링 컨테이너에 빈(bean)으로 등록
이 프록시 객체는 내부적으로 원본 객체를 참조하고 있으며, 원본 객체의 메서드 호출 시 트랜잭션 관련 로직(예: 트랜잭션 시작, 커밋, 롤백)을 수행한 후 실제 메서드를 호출합니다.
관심사의 분리: 비즈니스 로직과 트랜잭션 관리 로직을 분리함으로써 코드의 가독성과 유지보수성을 향상시킵니다. 개발자는 비즈니스 로직에 집중할 수 있으며, 트랜잭션 관리는 프레임워크가 담당합니다
선언적 트랜잭션 관리: @Transactional 애노테이션을 사용하여 선언적으로 트랜잭션을 관리할 수 있습니다. 이는 AOP(Aspect-Oriented Programming)를 기반으로 하며, 코드를 수정하지 않고도 트랜잭션 관리 정책을 적용_텍스트
프록시 방식의 AOP를 사용할 때는 프록시를 통하지 않고 대상 객체의 내부에서 다른 메서드를 직접 호출하면 AOP가 적용되지 않는 문제가 발생할 수 있습니다.
이는 트랜잭션 관리뿐만 아니라 보안, 로깅 등 다른 AOP 기능에도 해당되는 일반적인 문제입니다. 이를 해결하기 위해선 메서드 간의 호출이 프록시를 거쳐 이루어지도록 설계 변경이 필요할 수 있습니다(예: self-injection, 별도의 빈으로 분리).
결론적으로 프록시가 선언된 메서드에서 내부 메서드 호출에 대해 주의
스프링의 트랜잭션 AOP 기능은 public 메서드에만 트랜잭션을 적용하도록 기본 설정이 되어있다. 그래서 protected , private , package-visible 에는 트랜잭션이 적용되지 않는다
생각해보면 protected , package-visible 도 외부에서 호출이 가능하다. 따라서 이 부분은 앞서 설명한 프록시의 내부 호출과는 무관하고, 스프링이 막아둔 것이다.
그냥 스프링이 Public외 다 막아 놓음
트랜잭션? 더이상 나눌수 없는 하나의 단위
모든 디비는 트랜잭션 지원
하나의 명령을 실행했을때 디비가 그 명령을 실행 해줄 것 의미
디비에서는 명령이 끝날때까지 수행 내역을 로그의 저장
데이터 베이스에 반영된 내용을 재반영하기 위한 Redo로그
수행을 실패해 이전의 상태로 되돌리는 undo log를 이용해 트랜잭션지원
이건뭐야..