Spring 사무 주해@Transactional 실효 8 가지 장면 분석
5533 단어 Spring사무 주해@Transactional
@Transactional
service A(){
try{
insert();
serviceB.update();
}catch(){
throw new RunTimeException();
}
}
serviceB(){
@Transactional
update(){
try{
mapperB.update();
}catch(){
throw new RunTimeException();
}
}
}
mapperB (){
try{
//doSomething....
return true;
}catch(){
return false;
}
}
위의 예 에서 제 이상 이 다시//doSomething...의 sql 실행 이상 이 발생 했 습 니 다.serviceA 의 insert 는 계속 스크롤 백 을 할 수 없습니다.근본 적 인 원인 은 이상 한 곳 에서 false 만 되 돌 아 왔 기 때 문 입 니 다.운행 이상 을 던 지지 않 았 고 위로 던 지지 않 았 습 니 다.serviceB 에서 운반 이상 이 있 지만 false 만 받 았 기 때문에 스크롤 백 을 하지 않 습 니 다.다음은 흔히 볼 수 있 는 일이 굴 러 가지 않 는 집중 상황 을 요약 한다.
1.데이터베이스 엔진 은 트 랜 잭 션 을 지원 하지 않 습 니 다.
여기 서 MySQL 의 경우 MyISAM 엔진 은 트 랜 잭 션 을 지원 하지 않 으 며,InnoDB 야 말로 트 랜 잭 션 을 지원 하 는 엔진 으로 일반적으로 트 랜 잭 션 을 지원 하려 면 InnoDB 를 사용한다.
2.Spring 에 의 해 관리 되 지 않 음
아래 의 예 에서 보 듯 이:
// @Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
// update order
}
}
이때@Service 주석 을 주석 하면 이 종 류 는 Bean 으로 불 러 오지 않 습 니 다.이 종 류 는 Spring 에 의 해 관리 되 지 않 고 사 무 는 자 연 스 럽 게 효력 을 잃 습 니 다.3.방법 은 Public 가 아 닙 니 다.
@Transactional 은 Public 방법 에 만 사용 할 수 있 습 니 다.그렇지 않 으 면 업무 가 효력 을 잃 지 않 습 니 다.비 Public 방법 에 사용 하려 면 AspectJ 프 록 시 모드 를 열 수 있 습 니 다.
다음은 Spring 공식 문서 입 니 다.
When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.
하 긴
4.자체 호출 문제
두 가지 예 를 살 펴 보 자.
@Service
public class OrderServiceImpl implements OrderService {
public void update(Order order) {
updateOrder(order);
}
@Transactional
public void updateOrder(Order order) {
// update order
}
}
update 방법 에@Transactional 주 해 를 추가 하지 않 았 습 니 다.@Transactional 주해 가 있 는 updateOrder 방법 을 호출 하 십시오.updateOrder 방법 에 있 는 사무 가 효과 가 있 습 니까?다음 의 이 예 를 살 펴 보 자.
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void update(Order order) {
updateOrder(order);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(Order order) {
// update order
}
}
이번 에는 update 방법 에@Transactional,updateOrder 에 REQUIRES 를 추 가 했 습 니 다.NEW 가 새로 사 무 를 시작 하면 새로 연 사 무 는 효과 가 있 습 니까?이 두 가지 예 의 답 은:안 돼!
그들 은 자체 호출 이 발생 했 기 때문에 이러한 방법 을 바 꾸 었 고 Spring 의 대리 류 를 거치 지 않 았 으 며 외부 에서 만 사 무 를 호출 해 야 효력 이 발생 하 는 것 도 흔히 말 하 는 전형 적 인 문제 이다.
5.데이터 원본 에 트 랜 잭 션 관리자 가 설정 되 어 있 지 않 음
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
위 에서 보 듯 이 현재 데이터 원본 에 사무 관리 자 를 설정 하지 않 았 다 면 그것 도 헛수고 입 니 다!6.업무 지원 하지 않 음
아래 의 이 예 를 보십시오.
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void update(Order order) {
updateOrder(order);
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void updateOrder(Order order) {
// update order
}
}
Propagation.NOT_SUPPORTED:트 랜 잭 션 으로 실행 되 지 않 는 다 는 뜻 입 니 다.현재 트 랜 잭 션 이 존재 하면 끊 고 트 랜 잭 션 으로 실행 되 는 것 을 주동 적 으로 지원 하지 않 습 니 다.그 트 랜 잭 션 이 효력 을 발생 하 는 것 도 헛 된 것 입 니 다.7,이상 먹 혔 다
이것 도 비교적 많은 장면 이 나 타 났 다.
// @Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
}
}
}
이상 한 것 을 먹고 도 던 지지 않 으 니,일 은 어떻게 되 돌아 가 겠 는가!8.이상 유형 오류
위의 예 에서 이상 을 하나 더 던 집 니 다.
// @Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
throw new Exception(" ");
}
}
}
이 작업 도 유효 하지 않 습 니 다.기본 스크롤 백 은 Runtime Exception 입 니 다.다른 이상 한 스크롤 백 을 실행 하려 면 주석 에 설정 해 야 합 니 다.예 를 들 어:
@Transactional(rollbackFor = Exception.class)
이 설정 은 Throwable 이상 클래스 와 하위 클래스 에 만 제 한 됩 니 다.본 고 는 8 가지 업무 가 효력 을 잃 는 장면 을 정리 했다.사실은 가장 많이 발생 하 는 것 은 바로 자신의 호출,이상 하 게 먹 히 고 이상 하 게 던 지 는 유형 이 이 세 가지 가 아니다.
총결산
Spring 사무 주석@Transactional 실효 장면 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Spring 사무 주석@Transactional 실효 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.