>  기사  >  Java  >  Spring 트랜잭션 관리 관련 소개(코드 포함)

Spring 트랜잭션 관리 관련 소개(코드 포함)

不言
不言앞으로
2018-10-09 14:34:332662검색

이 글은 Spring 트랜잭션 관리(코드 포함)에 대한 소개를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

트랜잭션

각 부분이 모두 성공하거나 모두 실패하는 논리적 작업 집합

트랜잭션의 특징#🎜 🎜##🎜 🎜#

    일관성: 트랜잭션 전후의 데이터 무결성이 일관되게 유지됨
  • 원자성: 트랜잭션을 분할할 수 없거나 모두 성공할 수 있습니다. 또는 모두 실패
  • 격리: 트랜잭션 실행은 다른 트랜잭션의 영향을 받지 않으며 서로 격리됩니다
  • # 🎜🎜#지속성: 거래가 완료되면 데이터베이스에 저장되며 시스템 충돌의 영향을 받지 않습니다
  • 특성을 충족하지 못해 발생하는 문제# 🎜 🎜#
  • 격리로 인한 문제:

읽기 문제

더티 읽기: 트랜잭션이 아직 읽지 않은 다른 트랜잭션을 읽습니다. 커밋된 데이터

  • 반복 불가능한 읽기: 한 트랜잭션이 다른 트랜잭션에서 제출한

    update
  • 데이터를 읽어 일관되지 않은 쿼리 결과가 발생함# 🎜🎜 #
  • 팬텀 읽기: 하나의 트랜잭션이 다른 트랜잭션 에서 insert

    의 데이터를 읽어 일관성 없는 쿼리 결과가 발생함
  • #🎜🎜 ##🎜 🎜#
  • 쓰기 문제

    작업 손실

읽기 문제 해결#🎜 🎜## 🎜🎜#트랜잭션의 격리 수준 설정
  •    int ISOLATION_DEFAULT = -1;
        int ISOLATION_READ_UNCOMMITTED = 1;
        int ISOLATION_READ_COMMITTED = 2;
        int ISOLATION_REPEATABLE_READ = 4;
        int ISOLATION_SERIALIZABLE = 8;

ISOLATION_DEFAULT: 스프링 기본값을 나타냅니다. 기본 레이어가 사용됩니다. 데이터베이스의 기본 격리 수준입니다. 예를 들어, mysql은 ISOLATION_REPEATABLE_READ를 사용하고 ISOLATION_READ_COMMITTED를 사용합니다

ISOLATION_READ_UNCOMMITTED: 커밋되지 않은 읽기, 읽기 문제를 해결할 수 없음Spring 트랜잭션 관리 관련 소개(코드 포함)

    # 🎜🎜 #ISOLATION_READ_COMMITTED: 커밋된 읽기, 더티 읽기를 해결할 수 있지만 팬텀 읽기 및 반복 불가능한 읽기는 해결할 수 없습니다.
  • ISOLATION_REPEATABLE_READ: 반복 읽기, 더티 읽기 및 반복 불가능한 읽기를 해결할 수 있습니다. reads#🎜🎜 #
  • ISOLATION_SERIALIZABLE: 모든 읽기 문제를 해결할 수 있지만 효율성은 높지 않습니다
  • 거래용 API Spring의 관리
  • PlatformTransactionManager:플랫폼 트랜잭션 관리자

    PlatformTransactionManager는 Spring이 하위 계층에서 트랜잭션을 관리하는 데 사용하는 인터페이스이자 객체입니다.

  • public interface PlatformTransactionManager {
        TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
        void commit(TransactionStatus status) throws TransactionException;
        void rollback(TransactionStatus status) throws TransactionException;
    }

    spring things 공식 웹사이트 주소
더 일반적인 구현 클래스는 다음과 같습니다.

# 🎜 🎜#

DataSourceTransactionManager: 하단 레이어는 JDBC 트랜잭션 관리를 사용합니다

Spring 트랜잭션 관리 관련 소개(코드 포함)

HibernateTransactionManager: 하단 레이어는 Hibernate 트랜잭션 관리를 사용합니다

# 🎜🎜##🎜 🎜#
TransactionDefinition:

트랜잭션 정의: 트랜잭션 관련 정보, 트랜잭션 전파 동작, 격리 수준, 시간 초과 정보, 읽기 전용 여부를 정의할 수 있습니다#🎜 🎜#
    #🎜🎜 #
    package org.springframework.transaction;
    
    //可以看到事物的定义也是一个接口
    public interface TransactionDefinition {
        //事物的传播行为,7种
        int PROPAGATION_REQUIRED = 0;
        int PROPAGATION_SUPPORTS = 1;
        int PROPAGATION_MANDATORY = 2;
        int PROPAGATION_REQUIRES_NEW = 3;
        int PROPAGATION_NOT_SUPPORTED = 4;
        int PROPAGATION_NEVER = 5;
        int PROPAGATION_NESTED = 6;
        
        //事物的隔离级别五种
        int ISOLATION_DEFAULT = -1;
        int ISOLATION_READ_UNCOMMITTED = 1;
        int ISOLATION_READ_COMMITTED = 2;
        int ISOLATION_REPEATABLE_READ = 4;
        int ISOLATION_SERIALIZABLE = 8;
    
        //事物的超时时间,-1代表没有超时时间
        int TIMEOUT_DEFAULT = -1;
    
        int getPropagationBehavior();
    
        int getIsolationLevel();
    
        int getTimeout();
    
        boolean isReadOnly();
    
        String getName();
    }
  1. TransactionStatus: 거래 상태
  2. 거래 상태: 관리 거래 시 거래 상태를 기록하는 객체
  3. # 🎜🎜#

    Spring의 7가지 트랜잭션 유형의 전파 동작
트랜잭션의 전파 동작은 비즈니스 메서드 간의 상호 호출 문제를 해결하는 데 사용됩니다
  • 공식 웹 사이트 포털

    #🎜🎜 #전제 조건:
    메서드 B()에서 메소드 A() 호출

  • 중첩 트랜잭션
    # 🎜🎜#
  • PROPAGATION_NESTED: A 트랜잭션이 있고, 트랜잭션 A가 정상적으로 실행됩니다. 트랜잭션 A의 실행이 완료된 후 저장 지점을 설정하고 작업 B를 수행합니다. B에서 예외가 발생하면 초기 위치로 롤백되거나 저장 지점으로 롤백될 수 있습니다


    #🎜 🎜#

    동일한 트랜잭션에서 작업 보장

PROPAGATION_REQUIRED: 메소드 B가 메소드 A를 호출하고 메소드 A에 트랜잭션이 있는 경우 메소드 B는 해당 트랜잭션을 다음에서 사용합니다. 에이. A에 트랜잭션이 없으면 B는 트랜잭션

PROPAGATION_SUPPORTS를 생성합니다. A에 트랜잭션이 있으면 A에 트랜잭션을 사용합니다. A에 트랜잭션이 없으면 B에는 트랜잭션을 사용하지 마십시오


PROPAGATION_MANDATORY: A에 트랜잭션이 있으면 A에 트랜잭션을 사용하고 A에는 트랜잭션이 없습니다. , 예외 발생

    # 🎜🎜#
  • 작업이 동일한 트랜잭션에 있지 않은지 확인

PROPAGATION_REQUIRES_NEW: 있음 A의 트랜잭션, A 트랜잭션을 일시 중지하고 B에서 열린 트랜잭션에는 자체 작업만 포함됩니다. A에는 트랜잭션이 없으며 B가 생성한 트랜잭션에는 자체 작업만 포함되어 있습니다. 트랜잭션을 사용하지 마세요

*PROPAGATION_NEVER: A 트랜잭션 B에서 예외가 발생했습니다

  • Spring에서는 두 가지 트랜잭션 관리 방법을 제공합니다

  • # 🎜🎜#
  • 선언적 트랜잭션 관리: 코드 처리 대신 Spring 구성 파일에서 선언적 트랜잭션 처리(더 일반적으로 사용됨)

  • 프로그래밍 트랜잭션 관리: 코드 처리 트랜잭션은 프로그램에서 코딩되어야 합니다

    선언적 트랜잭션 관리
xml 기반

    <!--配置事务管理器-->
        <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
            <property name="dataSource" ref="dataSource" ></property>
        </bean>
    <!--配置事务-->
        <tx:advice id="myAdvice" transaction-manager="trancationManager">
            <tx:attributes>
                <!--配置事务传播和事务隔离-->
                <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ"/>
                <tx:method name="update*" propagation="REQUIRED"/>
                <tx:method name="delete*" propagation="REQUIRED"/>
                <tx:method name="find*" read-only="true"/>
                <tx:method name="*" propagation="REQUIRED" />
            </tx:attributes>
        </tx:advice>
        <!--事务是利用aop实现的-->
        <aop:config>
            <aop:pointcut id="ponitcut" expression="execution(* com.amber.xml.service.AccountServiceImpl.transferMoney(..))"></aop:pointcut>
            <aop:advisor advice-ref="myAdvice" pointcut-ref="ponitcut" />
        </aop:config>
  • save* 표현 save로 시작하는 메소드는 PROPATATION_REQUIRED 트랜잭션 전파 및 REPEATABLE_READ 트랜잭션 격리를 사용합니다

    基于注解

    <!--配置事务管理器-->
        <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
            <property name="dataSource" ref="dataSource" ></property>
        </bean>
        <!--开启注解事务-->
        <tx:annotation-driven transaction-manager="trancationManager" />

    使用tx:annotation-driven 开启事务的注解后,在使用的时候只需要在类或者方法上加入@Transactional就可以开启注解

    基于xml的事务和基于注解的事务对比

    • 文件配置对比
      事务基于注解简化了xml中的

    • 使用比较
      使用注解必须在类或者方法上添加@Trasactional,如果有多个业务类,则需要在每个业务类上添加
      使用xml只需要在配置文件中配置包名即可

    事务github代码

위 내용은 Spring 트랜잭션 관리 관련 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제