redis 결합 spring 의 트 랜 잭 션 사용
4089 단어 Java
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
이상 할 때 데이터 스크롤 백 이 필요 하 다 는 점 을 감안 하면 가장 먼저 생각 하 는 것 이 분명 하 다.
하지만 실제 작업 에 서 는 시계 세 장 이 사용 된다.예 를 들 어 A,B,C.
@Transactional(propagation = Propagation.REQUIRED)
public void all(){
A(); // A
B(); // B ,B A
C(); // C , C B A
}
1。데이터베이스 격 리 단계 변경(부정적인 방법)
데이터 가 A 표 에 삽입 되면 B 는 A 에 삽 입 된 새로운 데 이 터 를 사용 할 수 있 습 니 다.그러나 각 사무 간 에 독립 되 어 있 지만 큰 사무 에 포함 되 어 있 기 때문에 각 사무 간 에 일치 하기 때문에 다른 업무 의 미 제출 데 이 터 를 읽 지 못 합 니 다.만약 에 옆집 단 계 를 읽 고 제출 하지 않 은 데이터 로 설정 하면 더러 운 읽 기 를 초래 할 수 있 습 니 다.중복 읽 기와 환상 읽 기 가 불가능 합 니 다.그래서 이런 방법 은 배제 되 었 다.
2。redis 로 insert 의 데 이 터 를 저장 합 니 다.
spring 이 실행 방법 을 실행 할 때,비록 업무 수행 이 완료 되 지 않 았 지만,이때 데이터베이스 에 가서 메 인 키 를 조회 하면 데이터 가 없 지만,메 인 키 는 이미 변경 되 었 음 을 발견 할 수 있 습 니 다(예 를 들 어 원시 적 인 A 표 메 인 키 는 10 입 니 다.이때 A 의 방법 을 실행 한 후에 A 표 에 대해 insert 작업 을 하고 단점 은 B 의 방법 에서 끊 어 집 니 다.B 방법 으로 실 행 될 때 우 리 는 A 표 에 가서 기록 을 봅 니 다.spring 이 아직 commt 되 지 않 았 기 때문에 A 표 는 기록 되 지 않 았 을 것 입 니 다.그러나 A 표 의 메 인 키 는 반드시 10 보다 클 것 입 니 다.사무 가 제출 되 지 않 았 을 때 데 이 터 는 메모리 에 저장 되 어야 합 니 다.이상 이 발생 하면 데이터 스크롤 을 진행 할 때 메 인 키 는 작업 전의 메 인 키 로 변 합 니 다.
상술 한 두 가지 방법 을 총 결 한 후에 최종 정론 은 틀림없이 redis 의 방법 을 사용 한 것 이다.
그러나 spring 의 트 랜 잭 션 은 스크롤 백 을 지원 합 니 다.redis 의 데 이 터 는 스크롤 백 을 지원 하지 않 습 니 다.데이터 가 점점 많아 지면 redis 는 저 장 된 데이터 의 양 이 점점 커지 는 것 이 아 닙 니까?
redis 가 트 랜 잭 션 스크롤 백 을 할 수 없 는 상황 에 대해 서 는 논리 적 으로 스크롤 백 을 설정 해 야 합 니 다.
@Transactional
public void executeAllVoid(){
List A = null;
List B = null;
try {
A= voidA();
B= voidB();
voidC();
}catch (Exception e){
e.printStackTrace();
logger.error(" :",e);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}finally {
if(A != null) {
redisTemplate.opsForHash().delete(keyA, A.toArray());
}
if(B!= null){
redisTemplate.opsForHash().delete(keyB, B.toArray());
}
}
}
A 방법 과 B 방법 을 조작 할 때 이상 이 있 으 면 위로 던 지고 가장 바깥쪽 에 도착 하 는 방법 이 있 을 때 try catch 로 이상 을 포착 합 니 다.캡 처 가 이상 할 때 redis 가 설정 한 key 는 알 수 있 기 때문에 로 컬 session 에 저장 할 수 있 고 매개 변수 로 되 돌아 갈 수 있 습 니 다.그래서 저 희 는 catch 가 이상 할 때 수 동 redis 삭제 작업 을 통 해 redis 의 가짜 스크롤 백 상 태 를 만 듭 니 다.spring 트 랜 잭 션 에서 catch 가 이상 하 게 되면 spring 의 트 랜 잭 션 이 유효 하지 않 기 때문에 수 동 으로 스크롤 백 하거나 실행 중 이상 을 던 져 서 spring 스크롤 백 방금 동작 을 알려 야 합 니 다.
try{
}catch(Exception e){
throw new RuntimeException();
}
try{
}catch(Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
상술 한 코드 방법 은 둘 중 하 나 를 선택 하면 된다.
스프링 사무 에 관 한 연신 은 스프링 의 사무 에 7 가지 전파 특성 이 있다 는 것 을 알 고 있 기 때문에 일일이 예 를 들 지 않 겠 습 니 다.주로 세 가지 가 헷 갈 릴 수 있다.
1。PROPAGATION_REQUIRED:하나의 사무 가 존재 한다 면 현재 사무 에 가입 합 니 다.트 랜 잭 션 이 없 으 면 열 립 니 다.
2。PROPAGATION_REQUIRES_NEW:항상 새로운 사 무 를 시작 합 니 다.만약 하나의 업무 가 이미 존재 한다 면,이 존재 하 는 사 무 를 걸 어 라.
3.PROPAGATION_NESTED:하나의 이벤트 가 존재 한다 면 포 함 된 트 랜 잭 션 에서 실 행 됩 니 다.이벤트 가 없 으 면 TransactionDefinition.PROPAGATION 을 누 르 십시오.REQUIRED 속성 실행
첫 번 째 사 무 는 기본 적 인 사무 전파 특성 으로 본 고의 모든 사 무 는 이 를 바탕 으로 한다. 부류 의 방법 이 있 습 니 다.부류 의 방법 은 부류 의 방법 에서 실행 해 야 합 니 다.그러나 부류 와 부류 간 에 서로 독립 할 수 없습니다.부류 나 그 어떠한 부류 에 도 이상 이 발생 하면 스크롤 백 이 필요 합 니 다.
두 번 째 사무 와 첫 번 째 사 무 는 정반 대 이다.각 사무 간 에 서로 독립 된 부류 의 방법 에는 많은 부류 의 방법 이 있 는데 부류 나 그 어떠한 부류 의 방법 에 도 이상 이 발생 하면 이상 이 발생 하 는 방법 에 대해 서 만 스크롤 백 을 할 수 있 고 다른 방법 은 그의 영향 을 받 지 않 는 다.
세 번 째 사 무 는 등급 적 인 관계 이다. 부모 클래스 의 방법 에 이상 이 생 긴 다 면 부모 클래스 에 포 함 된 모든 하위 방법 은 스크롤 백 이 발생 하지만,하위 방법 에 이상 이 생 긴 다 면 부모 클래스 와 다른 하위 방법 은 이상 한 영향 을 받 지 않 고 데이터 정 보 를 스크롤 백 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.