springBoot service 계층 트 랜 잭 션 제어 작업

springBoot 는 사물 을 사용 하 는 것 이 간단 합 니 다.Application 시작 클래스 s 에@EnableTransactionManagement 주 해 를 추가 한 다음 service 층 의 방법 에@Transactional 주 해 를 추가 합 니 다.
@Transactional 속성
속성
유형
묘사 하 다.
value
String
선택 가능 한 한정 설명자,지정 한 트 랜 잭 션 관리자
propagation
enum: Propagation
선택 가능 한 트 랜 잭 션 전파 행위 설정
isolation
enum: Isolation
선택 한 트 랜 잭 션 격 리 단계 설정
readOnly
boolean
읽 기 쓰기 또는 읽 기 전용 사무,기본 읽 기 쓰기
timeout
int (in seconds granularity)
트 랜 잭 션 시간 초과 설정
rollbackFor
Class 대상 배열,Throwable 에서 계승 해 야 합 니 다.
트 랜 잭 션 스크롤 백 을 가 져 오 는 이상 클래스 배열
rollbackForClassName
클래스 이름 배열,Throwable 에서 계승 해 야 합 니 다.
트 랜 잭 션 스크롤 백 을 가 져 오 는 이상 클래스 이름 배열
noRollbackFor
Class 대상 배열,Throwable 에서 계승 해 야 합 니 다.
트 랜 잭 션 스크롤 백 을 일 으 키 지 않 는 이상 클래스 그룹
noRollbackForClassName
클래스 이름 배열,Throwable 에서 계승 해 야 합 니 다.
트 랜 잭 션 스크롤 백 을 일 으 키 지 않 는 이상 클래스 이름 배열
사용법:
@Transactional 은 인터페이스,인터페이스 방법,클래스 및 클래스 방법 에 작용 할 수 있 습 니 다.클래스 에 사용 할 때 이 클래스 의 모든 Public 방법 은 이 유형의 사무 속성 을 가지 고 있 으 며,방법 단계 에서 이 레이 블 을 사용 하여 클래스 의 정 의 를 덮어 쓸 수 있 습 니 다.
@Transactional 주 해 는 인터페이스,인터페이스 방법,클래스 및 클래스 방법 에 작용 할 수 있 지만,Spring 은 인터페이스 나 인터페이스 방법 에 이 주 해 를 사용 하지 않 는 것 을 권장 합 니 다.인터페이스 기반 프 록 시 를 사용 할 때 만 유효 하기 때 문 입 니 다.
또한,@Transactional 주 해 는 Public 방법 에 만 적용 되 어야 하 며,이 는 Spring AOP 의 본질 에 의 해 결정 된다.
proctected,private 또는 기본 적 인 보이 기 쉬 운 방법 에@Transactional 주 해 를 사용 하면 무시 되 고 이상 을 던 지지 않 습 니 다.
기본 적 인 상황 에서 외부 에서 호출 된 방법 만 AOP 에이전트 에 의 해 포 착 됩 니 다.즉,클래스 내부 방법 이 이러한 내부 의 다른 방법 을 호출 하 는 것 은 업무 행 위 를 일 으 키 지 않 습 니 다.호출 된 방법 이@Transactional 주 해 를 사용 하 더 라 도 수 정 됩 니 다.
방법 에 대한 설명:

@Autowired 
private MyBatisDao dao; 
@Transactional 
@Override 
public void insert(Test test) { 
 dao.insert(test); 
 throw new RuntimeException("test");//  unchecked  ,    ,   
} 

 @Transactional(noRollbackFor=RuntimeException.class) 
 @Override 
 public void insert(Test test) { 
  dao.insert(test); 
  //  unchecked  ,    ,noRollbackFor=RuntimeException.class,    
  throw new RuntimeException("test"); 
 } 

@Transactional(propagation=Propagation.NOT_SUPPORTED) 
@Override 
public void insert(Test test) { 
 //       PROPAGATION_NOT_SUPPORTED,        ,        
 dao.insert(test); 
} 
클래스 에 대한 설명:클래스 에 사용 할 때 이 클래스 의 모든 Public 방법 은 이 유형의 사무 속성 을 가지 게 됩 니 다.

@Transactional 
public class MyBatisServiceImpl implements MyBatisService { 
 @Autowired 
 private MyBatisDao dao; 
   
 @Override 
 public void insert(Test test) { 
  dao.insert(test); 
  //  unchecked  ,    ,   
  throw new RuntimeException("test"); 
 } 
주의:개발 할 때 주 해 를 추가 한 후에 스크롤 백 을 할 수 없 는 경우 가 있 습 니 다.
원인:기본 spring 사 무 는 캡 처 되 지 않 은 Runtime Exception 이 발생 할 때 만 굴 러 갑 니 다.
spring op 이상 캡 처 원리:차단 되 는 방법 은 명시 적 으로 이상 을 던 져 야 합 니 다.어떠한 처리 도 거치 지 않 습 니 다.그래 야 op 대리 가 방법의 이상 을 캡 처 할 수 있 고 스크롤 백 을 할 수 있 습 니 다.기본 적 인 상황 에서 op 은 Runtime Exception 의 이상 만 캡 처 할 수 있 지만 설정 을 통 해 특정한 이상 을 캡 처 하고 스크롤 백 할 수 있 습 니 다.
다시 말 하면 서비스 방법 에 try catch 를 사용 하지 않 거나 catch 에 throw new runtimeeexcetpion()을 추가 하면 프로그램 이 이상 할 때 op 에 잡 혀 스크롤 백 할 수 있 습 니 다.
해결 방안:
1.service 층 방법 에서 Runtime Exception 이상 을 던 지고(예 를 들 어 Catch 에서 사용자 정의 이상 을 던 지면 사용자 정의 이상 계승 Runtime Exception 만 하면 됩 니 다)이 이상 을 계속 캡 처 하고 처리 합 니 다.
2.service 계층 방법의 catch 구문 에 추가:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
문 구 는 수 동 으로 굴 러 가면 상층 부 에서 이상 을 처리 할 필요 가 없다.
보충:springboot 여러 서비스 가 서로 호출 되 는 사무 처리
오늘 은 하나의 service 방법 A 에서 다른 service 를 호출 하 는 방법 B.방법 A 와 방법 B 는 모두 데이터 베 이 스 를 삽입 하 는 작업 이 존재 하고@Transaction 주해 도 추가 되 었 으 나 B 방법 에서 이상 을 던 졌 을 때 A 의 삽입 문 구 는 성공 적 으로 실 행 될 수 있 습 니 다.
설명 설정 은 다음 과 같 습 니 다:

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED)
아무리 생각해 도 이해 가 되 지 않 고 관련 자 료 를 찾 은 후에 문 제 는@Transaction 주해 의 설정 에 있 습 니 다.이상 스크롤 백 을 설정 해 야 합 니 다.

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED,rollbackFor = Exception.class)
이렇게 하면 B 방법 에서 이상 을 던 지면 A 의 조작 도 스크롤 백 을 하고 사 무 는 제어 역할 을 한다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기