Spring Transaction Management에 대해 이야기하기 전에 Spring을 사용하지 않을 때 최대 절전 모드에서 데이터 작업을 수행하는 방법에 대해 생각해 봅시다. 최대 절전 모드에서는 먼저 거래를 시작한 다음 데이터 운영을 수행 한 다음 거래를 제출 한 다음 거래를 종료해야합니다. 우리가 그렇게하는 이유는 Hibernate의 기본 트랜잭션 자동 커밋이 False이므로 거래를 수동으로 제출해야하기 때문입니다. 매번 수동으로 트랜잭션을 제출하지 않으려면 내 파일 Hibernate.cfg.xml의 트랜잭션을 자동으로 커밋하도록 설정할 수 있습니다.
XML 코드
<속성 이름 = "DefaultAutoCommit"> <alue> false </value> </property>
트랜잭션 커밋 방법을 자동으로 설정하더라도 데이터 운영을 수행 할 수 있지만 실제 비즈니스 요구를 충족시키지 못합니다. 때로는 하나의 데이터를 저장 한 후에는 다른 데이터를 계속 저장할 수 있기를 바랍니다. 둘 이상의 데이터를 저장 한 후 거래를 함께 커밋하고 싶습니다. 이런 식으로 오류가 있더라도 데이터의 일관성을 롤백하고 보호 할 수 있습니다. 성공 또는 실패. 이 시점에서는 하나의 데이터를 저장 한 후 트랜잭션을 자동으로 커밋 할 수 없습니다. 이는 동일한 트랜잭션에 있지 않기 때문에 데이터의 일관성을 보장 할 수 없습니다. 따라서 현재 트랜잭션을 수동으로 구성해야하며, 이는 최대 절전 모드를 위해 Spring에서 제공하는 트랜잭션 관리 메커니즘을 사용해야합니다. Spring이 제공 한 거래 관리는 프로그래밍 방식과 선언의 두 가지 범주로 나눌 수 있습니다. 프로그래밍은 실제로 코드에서 제어됩니다. 최대 절전 모드가 데이터를 운영하는 것처럼 트랜잭션을 시작하고 트랜잭션을 제출합니다. 이 방법에는 특정 제한 사항이 있으므로 일반적으로 선언을 사용하여 트랜잭션을 구성합니다.
선언 트랜잭션 구성은 주로 다음 단계로 나뉩니다.
1. 선언적 트랜잭션 구성
(1) 거래 관리자 구성;
(2) 거래의 전파 특성;
(3) 이러한 클래스와 방법은 거래를 사용합니다.
<!-트랜잭션 관리자가 기능을 지정하고 처리를 위해 트랜잭션을 스프링으로 전달하는 세션 변형을 구성합니다-> <bean id = "transactionManager"> <속성 이름 = "sessionFactory"> <Ref Bean = "sessionFactory"/> </property> </bean> <! <tx : transAction-manger = "" "txAMPICE" "> <tx : attributes> <tx : 메소드 이름 = "저장*"propagation = "필수"/> <tx : 메소드 이름 = "delete*"propagation = "필수"/> <tx : 메소드 이름 = "update*"propagation = "필수"/> <tx : 메소드 이름 = "get*"read-on = "true"provagation = "nont_supported"/> read-doly = "true"/> </tx : attributes> </tx : 조언> <!-해당 클래스의 트랜잭션에 참여하는 방법-> <aop : config> <aop : pointcut id = "allserviceMethod"expression = "execution (*com.coe.service.*.*())"<aop : Advisor pointcut-ref = "allserviceTod" 조언 -ref = "txadvice"/> </aop : config>
트랜잭션을 구성 할 때 일반적으로 트랜잭션 경계를 서비스 계층, 즉 비즈니스 로직 계층으로 설정합니다. 비즈니스 로직 계층에서 데이터 작업 열 중 일부를 종종 완료하기 때문입니다. DAO 데이터 계층에 배치하면 세분성이 너무 작습니다. 또한 비즈니스 로직 계층의 트랜잭션을 구성하면 실제로 작동 할 때 나중에 찾을 수있는 보조 캐시에도 도움이됩니다.
2. 비즈니스 로직 방법을 작성하십시오
현재 HibernateTemplate에서 제공된 데이터 작동 방법을 사용하여 비즈니스 로직 계층에 비즈니스 로직 방법을 작성할 수 있습니다. 물론, 우리의 방법은 저장, 삭제, 업데이트 및 메소드의 시작과 관련하여 트랜잭션 구성에서 구성된 것과 동일해야합니다. 기본적으로 런타임 예외는 롤백 (runtimeexception 서브 클래스 상속 포함) 만 롤백하며 일반적인 예외는 롤백되지 않습니다.
마지막으로 거래의 여러 전파 특성을 요약하겠습니다.
1. Propagation_Required : 거래가 존재하면 현재 트랜잭션이 지원됩니다. 거래가없는 경우 활성화됩니다.
2. propagation_supports : 거래가 존재하면 현재 트랜잭션이 지원됩니다. 거래가없는 경우, 비 번역의 실행;
3. Propagation_mandatory : 거래가 이미 존재하면 현재 트랜잭션이 지원됩니다. 활성 거래가없는 경우 예외가 발생합니다.
4. Propagation_Requires_New : 항상 새로운 트랜잭션을 열십시오. 거래가 이미 존재하면 기존 거래가 중단됩니다.
5. propagation_not_supported : 항상 비 트랜잭션을 실행하고 기존 거래를 중단합니다.
6. propagation_never : 활성 거래가 존재하면 항상 비 트랜잭션으로 실행됩니다. 예외가 발생합니다.
7. propagation_nested : 활성 트랜잭션이 존재하면 중첩 트랜잭션에서 실행됩니다. 활성 트랜잭션이없는 경우 TransactionDefinition.propagation_required 속성에 따라 실행하십시오.
이 기사를 통해 Spring 및 Hibernate의 통합 거래 관리를 이해하는 데 도움이되기를 바랍니다. 이 웹 사이트를 지원 해주셔서 감사합니다!