2010-09-07 3 views
7

Spring의 트랜잭션 관리자의 활동 (시작, 커밋 & 롤백)에 대한 다양한 기록이 있습니다. 그러나 최근에는 교착 상태 문제로 인해 로깅만으로는 충분하지 않습니다.Spring 트랜잭션 내용을 기록하는 방법

우리 코드의 근본적인 문제는 트랜잭션 전파 REQUIRED 및 REQUIRES_NEW의 지저분한 사용법입니다. 많은 메소드 호출이 앞뒤로 반복되므로 많은 트랜잭션이 서로 겹쳐서 끝납니다. 아아, 코드 기반이 크고 해결책이 시급한데 ... (우리 모두는 이것이 무엇인지 압니다.)

코드가 다른 트랜잭션에서 순차적으로 수정 된 트랜잭션의 쿼리 엔터티에 추가 되었기 때문에 문제가 교착 상태였습니다. 트랜잭션. Spring은 엔티티 X의 업데이트가 잠겨 있기 때문에 타임 아웃을 알리는 예외를 발생시킵니다. 자, 이걸 알면 좋겠지 만, 오류 코드를 어떻게 발견할까요? 초기 잠금을 수행하는 쿼리.

내 질문 (마침내) : 트랜잭션에 추가되는 엔티티를 기록하는 방법이 있습니까? 이 방법을 사용하면 Spring이 불만을 제기하는 엔터티를 잠그는 트랜잭션을 찾을 수 있습니다.

감사합니다. :-)

답변

0

ORM에서 검색어를 기록하십시오. "나쁜"거래를 쉽게 찾을 수있는 방법 일 수 있습니다.

1

Spring은 트랜잭션 관리자에게 위임하므로 Spring은 트랜잭션에서 어떤 엔티티가 접촉되었는지를 알지 못합니다. 트랜잭션 관리자는이를 처리합니다. Donz가 말했듯이 트랜잭션 관리자에게 정보를 제공하는 것이 최상의 조사 방법입니다.

또한 모든 트랜잭션 정의를 검토하고 쓰기 전용/감사 전용 또는 로깅과 같은 유형의 메소드를 제외한 모든 것에서 REQUIRES_NEW를 제거 할 수 있습니다. 주요 비즈니스 로직에 REQUIRES_NEW가있는 경우 버그 또는 일부 매우 이상한 디자인입니다. 맹목적으로 제거하면 생각보다 부작용이 적을 수 있습니다.

관련 문제