springBoot service 계층 트 랜 잭 션 제어 작업
4517 단어 SpringBootService사무.
@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 의 조작 도 스크롤 백 을 하고 사 무 는 제어 역할 을 한다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.