같은 클래스 에서 사무 방법 이 없 으 면 같은 유형의 사무 방법 문제 원인 과 해결 방법 을 호출 합 니 다.

2804 단어 spring
사무 없 는 a () 방법 에서 같은 유형의 사무 b () 방법 문제 원인 및 해결 방법 을 호출 합 니 다.
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:
이 대상 의 대리 대상 을 가 져 와 호출 합 니 다.구체 적 인 조작 은 다음 과 같다.
  • Spring - content. xml 컨 텍스트 에 설정 추가:
  • 
    
  • xxxServiceImpl 에서 (xxxService) (AopContext. currentProxy ()) 로 xxxService 의 프 록 시 클래스 를 얻 은 다음 에 트 랜 잭 션 방법 을 호출 하여 프 록 시 클래스 를 강제로 거 쳐 트 랜 잭 션 단면 을 활성화 합 니 다.

  • 해결 방법 3:
    많은 경우 에 방법 내 에서 호출 되 고 사 무 를 활성화 하 기 를 원 하 는 이 유 는 같은 방법 으로 DAO 작업 도 있 고 I / O 등 시간 이 걸 리 기 때문에 시간 이 걸 리 는 I / O 로 인해 업무 가 너무 오래 걸 리 지 않 기 때 문 입 니 다 (예 를 들 어 새로 추 가 된 상품 과 동시에 재 고 를 기록 해 야 합 니 다).이때 I / O 를 비동기 작업 (예 를 들 어 스 레 드 탱크 에 가입 하 는 것) 으로 만 들 수 있 고 스 레 드 탱크 에 가입 하 는 작업 은 업무 에 가입 하 더 라 도 업무 가 너무 길 지 않 아 문 제 를 쉽게 해결 할 수 있다.
    해결 방법 4:
    @ Autowired 로 자신 을 주입 하고 주입 한 bean 으로 자신 을 호출 하 는 방법 도 가능 합 니 다.

    좋은 웹페이지 즐겨찾기