같은 클래스 에서 사무 방법 이 없 으 면 같은 유형의 사무 방법 문제 원인 과 해결 방법 을 호출 합 니 다.
2804 단어 spring
Spring 에서 관리 하 는 프로젝트 에서 방법 B 는 Transactional 주 해 를 사용 하여 사무 성 을 실현 하려 고 합 니 다.그러나 같은 class 의 방법 A 호출 방법 B 는 방법 B 의 이상 이 더 이상 스크롤 백, 즉 업무 가 효력 을 잃 지 않 는 다 는 것 을 발견 할 수 있 습 니 다.
이 방법 이 같은 종류 로 호출 되 었 을 때, spring 은 이 방법 을 사무 관리 에 추가 할 수 없습니다.
public class UserService extends BaseServerTest {
private static final Logger logger = Logger.getLogger(PropagationTest.class);
@Autowired
UserMapper userMapper;
@Test
public void a() {
try {
b();
} catch (Exception e) {
throw new RuntimeException();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = RuntimeException.class)
public void b() {
try {
userMapper.saveNews(new JSONArray());
} catch (Exception e) {
throw new RuntimeException();
}
}
}
원인:
성명 식 사 무 는 Spring AOP 를 바탕 으로 구체 적 인 업무 논리 와 업무 처 리 를 결합 시 킵 니 다. Spring 의 AOP 대리 에서 목표 방법 만 외부 에서 호출 되 고 목표 방법 은 Spring 에서 생 성 된 대리 대상 이 관리 합 니 다. 이것 은 자체 호출 문 제 를 초래 할 수 있 습 니 다.
spring 의 @ Transactional 트 랜 잭 션 이 적용 되 는 전 제 는 방법 호출 전에 차단 기 를 거 친 TransactionInterceptor 입 니 다. 즉, TransactionInterceptor 차단 기 를 통 해 만 spring 트 랜 잭 션 관리 에 가입 할 수 있 습 니 다.
같은 클래스 에서 호출 되 는 방법 이 라면 방법 차단기 에 의 해 차단 되 지 않 기 때문에 업무 가 작 동 하지 않 으 므 로 다른 클래스 에 방법 을 넣 고 스프링 을 통 해 주입 해 야 합 니 다.
Transactional 은 Spring 이 제공 하 는 사무 관리 주해 입 니 다.
중요 한 것 은 Spring 이 동적 에이전트 (AOP) 를 사용 하여 bean 에 대한 관리 와 절편 을 실현 하고 우리 의 모든 class 에 대리 대상 을 생 성 하 는 것 이다.프 록 시 대상 간 에 만 호출 할 때 절단면 논 리 를 촉발 할 수 있 습 니 다.
같은 class 에서 방법 A 호출 방법 B 는 에이전트 대상 을 통과 하지 않 고 원래 대상 의 방법 을 호출 합 니 다.그래서 Spring 은 이번 호출 을 자 를 수 없고 주 해 를 통 해 사무 성 을 보장 할 수 없습니다.
같은 클래스 에서 의 방법 이 호출 되면 방법 차단기 에 의 해 차단 되 지 않 기 때문에 일이 작용 하지 않 는 다 는 것 이다.
해결 방법
해결 방법 1:
트 랜 잭 션 방법 을 다른 클래스 에 넣 거나 (또는 한 층 을 따로 열 고 '트 랜 잭 션 층' 이 라 고 이름 짓 기) 호출 하면 대상 간 호출 조건 에 부합 합 니 다.
해결 방법 2:
이 대상 의 대리 대상 을 가 져 와 호출 합 니 다.구체 적 인 조작 은 다음 과 같다.
해결 방법 3:
많은 경우 에 방법 내 에서 호출 되 고 사 무 를 활성화 하 기 를 원 하 는 이 유 는 같은 방법 으로 DAO 작업 도 있 고 I / O 등 시간 이 걸 리 기 때문에 시간 이 걸 리 는 I / O 로 인해 업무 가 너무 오래 걸 리 지 않 기 때 문 입 니 다 (예 를 들 어 새로 추 가 된 상품 과 동시에 재 고 를 기록 해 야 합 니 다).이때 I / O 를 비동기 작업 (예 를 들 어 스 레 드 탱크 에 가입 하 는 것) 으로 만 들 수 있 고 스 레 드 탱크 에 가입 하 는 작업 은 업무 에 가입 하 더 라 도 업무 가 너무 길 지 않 아 문 제 를 쉽게 해결 할 수 있다.
해결 방법 4:
@ Autowired 로 자신 을 주입 하고 주입 한 bean 으로 자신 을 호출 하 는 방법 도 가능 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.