1. 사용 시나리오의 예
@transactional이 어떻게 사용되는지 이해하기 전에 먼저 @transactional이 유용한 것을 알아야합니다. 예를 들어, 부서에는 많은 회원이 있으며이 두 개는 각각 부서 테이블과 회원 테이블에 저장되어 있습니다. 특정 부서를 삭제할 때는 해당 멤버를 기본적으로 삭제한다고 가정합니다. 그러나 이것은 실행 중에 발생할 수 있습니다. 먼저 부서를 삭제 한 다음 멤버를 삭제합니다. 그러나 부서는이를 성공적으로 삭제했으며 회원을 삭제할 때 예외가 발생했습니다. 현재 회원 삭제가 실패하면 이전에 삭제 된 부서도 삭제를 취소하기를 바랍니다. 이 시나리오는 @transactional을 사용하여 롤백 할 수 있습니다.
2. 점검 예외 및 확인되지 않은 예외
우리가 모든 사람에게 확인 된 예외의 개념을 알리고 확인되지 않은 예외를 알리는 이유는 다음과 같습니다.
Spring은 선언적 거래 처리를 사용합니다. 기본적으로 주석이없는 데이터베이스 작동 방법에서 확인되지 않은 예외가 발생하면 모든 데이터베이스 작업이 롤백됩니다. 예외가 확인 된 예외 인 경우 데이터베이스 작업은 기본적으로 여전히 제출됩니다.
점검 예외 :
유효하지 않으며 프로그램에서 예측할 수 없습니다. 예를 들어, 유효하지 않은 사용자 입력, 파일이 존재하지 않으며 네트워크 또는 데이터베이스 링크 오류가 발생합니다. 이것들은 모두 외부 이유이며 프로그램에 의해 통제되지는 않습니다.
코드에서 명시 적으로 처리해야합니다. 예를 들어, 트리-캐치 블록 처리 또는 콜 스택의 이전 레이어에 대한 예외를 던지는 설명과 함께 예외를 던집니다.
java.lang.exception에서 상속 (java.lang.runtimeexception 제외).
확인되지 않은 예외 :
오류를 나타냅니다. 프로그램의 논리가 잘못되었습니다. 불법 행위, NullPointerException 및 불법 스테이트 외환과 같은 runtimeexception의 서브 클래스입니다.
처리를위한 코드에서 점검되지 않은 예외를 명시 적으로 포착 할 필요가 없습니다.
java.lang.runtimeexception (및 java.lang.runtimeexception에서 상속받은 java.lang.exception에서 상속).
아래의 비정상 구조 다이어그램을 살펴보면 더 층이있을 수 있습니다.
3. @transactional 사용의 예
이 예제는 Eclipse+Maven을 사용합니다. Maven은 항아리로만 관리되며 이해하지 못하는 Maven의 Ape 친구조차도 이해할 수 있습니다.
3.1. 스프링 구성 파일
TX 네임 스페이스는 다음과 같이 먼저 구성해야합니다.
트랜잭션 기반 트랜잭션 관리를 사용하려면 봄에 다음 구성이 필요합니다.
<bean id = "AppTransactionManager"> <property name = "dataSource"ref = "dataSource" /> < /bean> <tx : 주석 중심의 대리-표적 클래스 = "false"transaction-manager = "AppTransactionManager" />
블로거의 전체 스프링 구성 파일 :
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : context = "http://www.springframework.org/schema/context"xmlns : "http://www.springframework.org/schema/tx"xmlns : aop = "http://www.springframwork.org/schema/op" xsi : schemalocation = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.xsd http://ww.springframework.org/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/sprging-context-3.0.xsd "> jdbc 구성 파일-> <bean id = "propertyconfigurer"> <property name = "locations"> <list> <value> classpath : properties/*. properties </value> <!-여러 구성 파일이있는 경우 여기에 계속 추가하십시오-> </list> </property> </bean> <!-<Bean id =-> <!-Source proper proper prope <!-속성 구성-> <!-속성 구성-> <!-<속성 이름 = "driverclassName"value = "com.mysql.jdbc.driver" /> <property name = "url"value = "jdbc : mysql : // localhost : 3306 /learning" />> <rocal name = "username" "username" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" value = "Christmas258@"/>-> <!-속성을 사용하여 구성-> <property name = "driverclassname"> <value> $ {jdbc_driverclassname} </value> </property> <property name = "url"> <value> $ {jdbc_url} </property> <property name = "username"> <value> $ {jdbc_username} </value> </value> </value> <property name = "password"> <value> $ {jdbc_password} </value> </property> </bean> <bean id = "apptransactionManager"> <property name = "dataSource"ref = "dataSource"/> </bean> <tx : annoTation indared-derget regy " Transaction-Manager = "AppTransactionManager" /> <!-xxxxxmapper.xml에 해당하는 모든 Mapper 인터페이스 파일을 자동으로 스캔하여 MPPER 매핑을 하나씩 수동으로 구성 할 필요가 없습니다. Mapper 인터페이스 클래스와 Mapper 매핑 파일이 서로 대응하는 한. -> <bean> <property name = "basePackage"value = "com.luo.dao" /> < /bean> <!-myBatis 파일 구성, mapperlocations configure ** mapper.xml 파일 위치, configlocation configure mybatis-config 파일 위치-> <bean id = "sqlsessionfactory"> datasouce "ref =" "dataSouce" "" <속성 이름 = "mapperlocations"value = "classpath : mapper/*. xml"/> <property name = "configlocation"value = "classpath : mybatis/mybatis-config.xml"/> <!-<속성 이름 = "glantealiasespackage"value = "com.tiantian.ckeditor.model"/<! <context : component-scan base-package = "com.luo.service" /> < /beans>3.2. @transactional을 사용하여 사용자 구현 클래스 메소드에 주석을 추가하십시오.
@transactional (propagation = propagation.required) public void addUser (user user) {userDao.adduser (사용자); 문자열 string = null; if (string.equals ( "")) {int i = 0; }}위의 방법에서는 고의적으로 Null 포인터 예외가 있었고 물건이 롤백됩니다.
3.3. 단위 테스트 클래스를 실행하십시오
@test public void addUsertest () {user user = new user (); user.setusername ( "luoguohui1"); user.setuserpassword ( "luoguohui1"); uservice.adduser (user);}삽입 할 수 없다는 것을 알았지 만 @transactional이 제거되면 코드는 다음과 같습니다. 예외가 발생하지만 여전히 데이터베이스에 추가 된 데이터가 있습니다.
3.4. 소스 코드 다운로드
이 기사의 최종 소스 코드를 다운로드하십시오 : First_Maven_Project_jb51.rar
4. 봄에 @Transactional을 이해해야한다는 개념
@Transactional in Spring은 동적 프록시 메커니즘을 기반으로하며 투명한 트랜잭션 관리 메커니즘을 제공하여 개발에서 발생하는 문제를 촉진하고 신속하게 해결합니다.
일반적으로 다음 코드를 통해 메소드 또는 인터페이스 또는 클래스를 주석하는 것입니다.
@transactional (propagation = provagation.not_supported)
전파는 7 가지 전파 메커니즘을 지원합니다.
필수 : 거래가 존재하면 현재 거래가 지원됩니다. 거래가 없으면 새로운 거래가 시작됩니다.
지원 : 거래가 존재하면 현재 거래가 지원됩니다. 거래가없는 경우 비 이동의 실행. 그러나 트랜잭션 동기화 트랜잭션 관리자의 경우 Propagation_Supports는 트랜잭션을 사용하지 않는 것과 약간 다릅니다.
not_supported : 항상 비 트랜잭션을 실행하고 기존 거래를 중단하십시오.
요구 사항 : 항상 새로운 거래를 시작하십시오. 거래가 이미 존재하면 기존 거래가 중단됩니다.
필수 : 거래가 이미 존재하는 경우 현재 거래를 지원하십시오. 활성 거래가없는 경우 예외가 발생합니다.
절대 : 활성 트랜잭션이 존재하면 예외가 발생합니다.
중첩 : 활성 거래가 존재하면 중첩 트랜잭션에서 실행됩니다. 활성 트랜잭션이없는 경우 필요한 속성을 눌러 실행하십시오.
다음은 몇 가지 주목해야 할 사항이 있습니다. 읽어야 할 사항은 다음과 같습니다. 그렇지 않으면 다양한 함정에 직면하면 블로거가 상기시켜주지 않았습니다.
다음은 몇 가지 주목해야 할 사항이 있습니다. 읽어야 할 사항은 다음과 같습니다. 그렇지 않으면 다양한 함정에 직면하면 블로거가 상기시켜주지 않았습니다.
다음은 몇 가지 주목해야 할 사항이 있습니다. 읽어야 할 사항은 다음과 같습니다. 그렇지 않으면 다양한 함정에 직면하면 블로거가 상기시켜주지 않았습니다.
트랜잭션 관리가 필요한 곳에 @transactional 주석을 추가하십시오. @transactional 주석은 인터페이스 정의 및 인터페이스 방법, 클래스 정의 및 클래스의 공개 메소드에 적용 할 수 있습니다.
@transactional 주석은 대중의 가시성이있는 방법에만 적용될 수 있습니다. 보호, 개인 또는 패키지 가시 가능한 메소드에서 @Transactional 주석을 사용하는 경우 오류가보고되지 않지만이 주석이 달린 메소드는 구성된 트랜잭션 설정을 표시하지 않습니다.
@transactional 주석의 발생은 트랜잭션 동작을 가능하게하기에 충분하지 않으며 일종의 메타 데이터 일뿐입니다. 구성 요소를 구성 파일에 사용하여 트랜잭션 동작을 진정으로 활성화해야합니다.
요소의 "프록시-표적 클래스"속성 값을 통해 인터페이스 기반 또는 클래스 기반 프록시가 생성되는지 여부를 제어합니다. "프록시-표적 클래스"장르 값이 "True"로 설정된 경우 클래스 기반 프록시가 작동합니다 (클래스 경로에서 cglib.jar가 필요합니다). "프록시-표적 클래스"장르 값이 "False"로 설정 되거나이 속성이 생략되면 표준 JDK 인터페이스 기반 프록시가 작동합니다.
Spring Team은 클래스가 구현하려는 인터페이스가 아닌 특정 클래스 (또는 클래스 방법)에서 @transactional 주석을 사용하는 것이 좋습니다. 인터페이스에서 @transactional 주석을 사용하면 인터페이스 기반 프록시를 설정할 때만 적용됩니다. 주석을 상속받을 수 없기 때문에 클래스 기반 프록시를 사용하는 경우 트랜잭션 설정은 클래스 기반 프록시에 의해 인식되지 않으며 트랜잭션 프록시에 의해 객체가 래핑되지 않습니다.
@transactional의 트랜잭션은 인터페이스 기반 또는 클래스 기반 프록시가 생성됩니다. 따라서 같은 클래스에서 한 메소드는 트랜잭션으로 다른 메소드를 호출하면 트랜잭션이 작동하지 않습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.