Spring Boot Transaction Management에서는 Self-Interface PlatformTransactionManager를 구현하십시오.
public interface platformtransactionmanager {org.springframework.transaction.transactionStatus getTransaction (org.springframework.transaction.transactionDefinition transactionDefinition)은 org.springframework.transaction.transactionException; void commit (org.springframework.transaction.transactionStatus transactionstatus)는 org.springframework.transaction.transactionException을 던집니다. void rollback (org.springframework.transaction.transactionStatus transactionstatus)을 org.springframework.transaction.transactionException;} 던지기Spring-Boot-Starter-JDBC 종속성을 사용하면 프레임 워크가 기본적으로 DataSourCetransactionManager를 자동으로 주입합니다. 따라서 트랜잭션 사용에 @transactional 주석을 사용하기 위해 추가 구성이 필요하지 않습니다.
JDBC 트랜잭션 관리자
서비스 중에 @transactional에 의해 주석이 달린 방법은 거래를 지원합니다. 주석이 클래스에있는 경우 전체 클래스의 모든 방법은 기본적으로 트랜잭션을 지원합니다.
다중 계산 관리자 상황
1 : TransactionManagementConfigurer 인터페이스를 구현할 수 있으며 내부의 메소드의 리턴 값은 기본 트랜잭션 관리자입니다.
2 : 특정 실행 방법에서 값을 설정할 수 있습니다.
스프링 컨테이너에 여러 개의 PlatformTransactionManager 인스턴스가 있고 인터페이스 TransactionManagementConfigurer가 기본값을 지정하도록 구현되지 않은 경우, 메소드에서 @transactional을 사용하면 값으로 지정해야합니다. 지정되지 않으면 예외가 발생합니다.
//@enableTransactionManagement // <tx : annotation-driven />@springBootApplicationPublic Class ProfileDemoApplication을 구현하는 주석 거래 관리 // transactionManagementConfigurer {@Resource (name = "txmanager2") private PlatformTransactionManager2; // 수동으로 트랜잭션 관리자를 생성 1 DataSource 프레임 워크가 자동으로 주입됩니다. // 스프링 컨테이너에서 수동으로 @Bean이 먼저로드되며 프레임 워크는 다른 PlatformTransactionManager 구현 클래스에 다시 스트리트하지 않습니다. @Bean (name = "txmanager1") public PlatformTransactionManager txManager (DataSource DataSource) {return new DataSourcetRansactionManager (DataSource); } // transactionManager 만들기 } // 반환 값이 기본적으로 사용한 트랜잭션 관리자가 여러 트랜잭션 관리자가있는 경우 기본적으로 사용한 트랜잭션 관리자를 나타내는 인터페이스 트랜잭션 관리 관리자 메소드를 구현하십시오. @override public platformtransactionManager AnnotationDriventRansactionManager () {return txmanager2; } public static void main (String [] args) {springApplication.run (profiledemoApplication.class, args); }}특정 구현
@ComponentPublic Class DevSendMessage는 SendMessage를 구현합니다 {// 값을 사용하여 @transactional (value = "txmanager1" ") @override public void send () {system.out.println (">>>>>>>>>>> dev send () <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< "; send2 (); } @transactional public void send2 () {system.out.println ( ">>>>>>>>>>>>> dev send2 () <<<<<<<<"); }}격리 수준
public enum 격리 {default (transactionDefinition.isolation_default), read_uncommitted (transactionDefinition.isolation_chommitt), read_committed (transactionDefinition.isolation_Read_Committ), reportable_Read (transActionDefinition.isolation_repeatable_Read), Serializable (TransactionDefinition.isolation_serializable); 개인 최종 INT 값; 격리 (int 값) {this.value = value; } public int value () {return this.value; }} 방법을 지정하십시오 : 분리 속성을 사용하여 설정하십시오.
@transactional (격리 = 격리 .Default)
의사 소통 행동
소위 거래 전파 동작은 현재 트랜잭션이 시작되기 전에 트랜잭션 컨텍스트가 이미 존재하는 경우 트랜잭션 방법의 실행 동작을 지정할 수있는 몇 가지 옵션이 있다고 말합니다.
org.springframework.transaction.annotation.propagation enumeration 클래스가 전파 동작을 나타내는 6 개의 열거 값을 정의하는 것을 알 수 있습니다.
public enum propagation {필수 (transactionDefinition.propagation_Required), 지원 (transactionDefinition.propagation_supports), 필수 (TransactionDefinition.Propagation_mandatory), require_new (TransactionDefinition.propagation_requires_new), not_supported (transactionDefinition.propagation_not_supported), never (transactionDefinition.propagation_never), 중첩 (transactionDefinition.propagation_nested); 개인 최종 INT 값; 전파 (int value) {this.value = value; } public int value () {return this.value; }}필수 : 거래가 현재 존재하는 경우 거래에 가입하십시오. 현재 거래가없는 경우 새 트랜잭션을 작성하십시오. 기본값.
지원 : 거래가 현재 존재하는 경우 거래에 가입하십시오. 현재 거래가없는 경우 비 트랜잭션 방식으로 계속 실행하십시오.
필수 : 거래가 현재 존재하는 경우 거래에 가입하십시오. 현재 거래가없는 경우 예외가 발생합니다. (거래에 강요당했습니다)
요구 사항 _new : 새로운 거래를 생성하고 현재 거래가 존재하면 현재 트랜잭션이 중단됩니다. (인쇄 로그가 종종 사용됩니다. 이전 롤백이 롤백 되더라도 트랜잭션이 실행되고 오류 메시지가 기록됩니다)
not_supported : 비 트랜잭션 방식으로 실행됩니다. 거래가 현재 존재하면 현재 거래가 중단됩니다.
절대 : 비 트랜잭션 방식으로 실행되면 거래가 현재 존재하는 경우 예외를 발생시킵니다.
중첩 : 거래가 현재 존재하는 경우, 현재 거래의 중첩 거래로 실행되도록 거래가 생성됩니다. 현재 거래가없는 경우 값은 필요한 것과 같습니다.
방법을 지정하십시오 : 전파 속성을 사용하여 설정하십시오.
@transactional (propagation = propagation.required)
롤백 상황이 아닙니다
끊임없는 runtimeexception이 발생한 경우에만 롤백하십시오
Catch가 던진 예외는 두 인서트가 모두 성공할 것입니다.
@override @transactional public void insertandinsert (직원 직원) {staffdao.insert (직원); {int i = 1 / 0; } catch (예외 e) {e.printstacktrace (); } staffdao.insert (직원); }서비스 계층 메소드의 캐치 문에 추가 : transactionAspectSupport.currentTransactionStatus (). setRollbackonly (); 문, 수동 롤백은 데이터를 삽입하지 않습니다
@override @transactional public void insertandinsert (직원)는 예외 {try {staffdao.insert (직원); int i = 1/0; Staffdao.insert (직원); } catch (예외 e) {transactionAspectSupport.currentTransactionStatus (). setRollbackonly (); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.