Spring 트랜잭션 모듈 메모

3424 단어
dao층이나 서비스층의 업무를 처리할 때, 예를 들어 삭제 실패 스크롤 작업은 '@Transactional' 을 주석으로 사용하지만, 설정 파일에서 활성화해야 합니다
 @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
 public int deleteByName(String name) { 
 int result = companyDAO.deleteByName(name); 
 return result; 
 }


트랜잭션 전파 동작 유형 설명 PROPAGATIONREQUIRED에 현재 업무가 없으면 새 업무를 만듭니다. 이미 업무가 존재하면 이 업무에 가입하십시오.이것은 가장 흔히 볼 수 있는 선택이다.PROPAGATION_SUPPORTS는 현재 트랜잭션을 지원하며 현재 트랜잭션이 없으면 비트랜잭션으로 수행합니다.PROPAGATION_MANDATORY는 현재 업무를 사용합니다. 현재 업무가 없으면 이상을 던집니다.PROPAGATION_REQUIRES_NEW 새 트랜잭션입니다. 현재 트랜잭션이 있는 경우 현재 트랜잭션을 중단합니다.PROPAGATION_NOT_SUPPORTED는 현재 업무가 존재하면 현재 업무를 마운트합니다.PROPAGATION_NEVER는 비트랜잭션으로 실행되며 현재 트랜잭션이 있는 경우 예외 PROPAGATIONNESTED는 현재 트랜잭션이 있는 경우 중첩된 트랜잭션 내에서 수행됩니다.현재 트랜잭션이 없는 경우 PROPAGATIONREQUIRED와 유사한 작업
readOnly: 사무의 읽기와 쓰기 속성,true 또는false,true는 읽기 전용,기본값false rollbackFor:스크롤 정책,지정한 이상이 있을 때 스크롤합니다.예를 들어 상례에서 이상이 발생하면 스크롤timeout(보충): 시간 초과 설정, 단위는 초isolation: 사무 격리 단계 설정, 매거 유형 총 5가지
유형 설명 DEFAULT는 데이터베이스의 기본 격리 수준인 READ 를 사용합니다.UNCOMMITTED가 커밋되지 않은 데이터를 읽습니다(더티(dirty) READCOMMITTED가 제출한 데이터를 읽습니다(환독, 즉 앞뒤 두 번 읽는 것이 다르다)REPEATABLEREAD는 반복적으로 읽을 수 있으며 환독SERIALIZABLE 직렬화(자원의 소모가 크고 사용하지 않음)

예를 들어 Spring 네스트된 트랜잭션 분석

ServiceA {
       
     void methodA() {
         ServiceB.methodB();
     }
  
}
  
ServiceB {
       
     void methodB() {
     }
       
}

PROPAGATION_REQUIRED가 현재 실행하고 있는 업무가 다른 업무에 없다면 새로운 업무를 만듭니다. 예를 들어 서비스B.methodB의 트랜잭션 수준은 PROPAGATION 으로 정의됩니다.REQUIRED, Service A.methodA의 경우 서비스 A.methodA에서 트랜잭션이 시작되었으며 ServiceB를 호출합니다.methodB,ServiceB.methodB는 자신이 이미 ServiceA에서 실행 중인 것을 보았습니다.methodA의 사무 내부에서는 새로운 사무가 일어나지 않습니다.만약 서비스 A가methodA가 실행될 때 자신이 업무에 없는 것을 발견하면, 그는 자신을 위해 업무를 분배할 것이다.서비스 A.methodA 또는 ServiceB.methodB 내의 어느 곳에서든 이상이 발생하면 업무가 굴러갑니다.서비스 B.methodB 트랜잭션이 제출되었지만 서비스 A.methodA 는 다음 fail 에서 롤백됩니다. 서비스 B.methodB 도 롤백
PROPAGATION_SUPPORTS는 현재 트랜잭션에 있는 경우 트랜잭션으로 실행되며, 더 이상 트랜잭션이 없는 경우 PROPAGATIONMANDATORY는 하나의 트랜잭션에서 실행되어야 합니다.그는 아버지 사무에 한 명만 호출될 수 있다는 얘기다.그렇지 않으면, 그는 이상 PROPAGATION을 던질 것이다REQUIRES_뉴야, 이건 좀 까다로워.예를 들어 저희가 서비스 A를 디자인했습니다.methodA의 트랜잭션 수준은 PROPAGATIONREQUIRED,ServiceB.methodB 트랜잭션 수준은 PROPAGATIONREQUIRES_NEW, Service B.methodB에서 서비스 A.methodA가 있는 업무가 중단됩니다. 서비스 B.methodB에서 새로운 업무가 발생하여 서비스 B를 기다립니다.methodB의 업무가 끝난 후에야 그는 계속 집행했다.그와 PROPAGATIONREQUIRED의 업무 차이는 업무의 롤백 정도에 있다.서비스 때문에 B.methodB는 두 가지 다른 업무가 존재하는 새로운 업무입니다.하면, 만약, 만약...methodB가 제출되었으면 서비스 A.methodA 실패 롤백, 서비스 B.methodB는 굴러가지 않습니다.하면, 만약, 만약...methodB 를 롤백하지 못했습니다. 만약 그가 던진 이상이 서비스 A에 의해methodA 캡처, 서비스 AmethodA 트랜잭션이 여전히 커밋될 수 있습니다.
PROPAGATION_NOT_SUPPORTED는 현재 트랜잭션을 지원하지 않습니다.예를 들어 서비스 A.methodA의 트랜잭션 수준은 PROPAGATIONREQUIRED, ServiceB.methodB의 트랜잭션 수준은 PROPAGATIONNOT_SUPPORTED, 그러면 서비스B로 실행됩니다.methodB의 경우 서비스 A.methodA의 트랜잭션이 중단되고 비트랜잭션 상태로 실행된 다음 Service A.methodA 트랜잭션PROPAGATION_NEVER는 트랜잭션에서 실행할 수 없습니다.서비스 A를 가정합니다.methodA의 트랜잭션 수준은 PROPAGATIONREQUIRED, ServiceB.methodB의 트랜잭션 수준은 PROPAGATIONNEVER, 그렇다면 ServiceB.methodB가 이상을 던질 거야.PROPAGATION_NESTED가 Nested를 이해하는 관건은 savepoint이다.그와 PROPAGATIONREQUIRES_NEW의 차이점은 PROPAGATIONREQUIRES_NEW는 또 다른 사무를 시작한다. 그의 아버지 사무와 서로 독립할 것이다. Nested의 사무와 그의 아버지 사무는 서로 의지한다. 그의 제출은 그의 아버지 사무와 함께 제출해야 한다.아버지의 일이 마지막에 굴러간다면 그도 굴러간다는 얘기다.Nested 업무의 장점은 그가 savepoint를 가지고 있다는 것이다.

Spring 일반 메모


http://www.voidcn.com/article/p-vnuuxhnq-bcq.html

좋은 웹페이지 즐겨찾기