美文网首页
spring 申明式事务管理

spring 申明式事务管理

作者: 代码potty | 来源:发表于2018-08-16 17:31 被阅读0次

    spring的申明式事务管理有三种
    1、基于注解申明式事务管理
    2、基于AOP申明式事务管理
    3、基于tx/aop的申明式事务管理

    1、基于注解申明式事务管理
    配置文件:

        <context:component-scan base-package="org.music.service"/>
        
            <!-- 配置事务管理器 -->
            <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
                <!-- 注入事务连接池 -->
                <property name="dataSource" ref="dataSource"/>
            </bean>
        
            <!-- 配置基于注解的申明式事务 -->
            <tx:annotation-driven transaction-manager="transactionManager"/>
    

    然后在需要的类或者方法上加上@Transactional注释即可

    2、基于AOP申明式事务管理

        <context:component-scan base-package="org.music.service"/>
        
           <!-- 配置事务管理器 -->
           <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
               <!-- 注入事务连接池 -->
               <property name="dataSource" ref="dataSource"/>
           </bean>
        
        
           <bean id="tranProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
               <property name="transactionManager" ref="transactionManager" />
               <property name="target" value="musicServiceImpl"/>
               <property name="transactionAttributes">
                   <props>
                       <prop key="transfer">ISOLATION_DEFAULT,PROPAGATION_REQUIRED</prop>
                   </props>
               </property>
           </bean>
    

    3、基于tx/aop的申明式事务管理

        <!-- 配置事务管理器 -->
           <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
               <!-- 注入事务连接池 -->
               <property name="dataSource" ref="dataSource"/>
           </bean>
        
           <tx:advice id="txAdvice" transaction-manager="transactionManager">
               <tx:attributes>
                   <tx:method name="transfer" propagation="REQUIRED"/>
               </tx:attributes>
           </tx:advice>
        
           <aop:config>
               <aop:pointcut id="musicPoint" expression="@annotation(org.music.annotation.MusicAnnotation)" />
               <aop:advisor advice-ref="txAdvice" pointcut-ref="musicPoint" />
           </aop:config>
    

    spring事务的参数有八种,分别是:
    参数有isolation、propagation、timeout、noRollbackForClassName、RollbackForClassName
    noRollbackFor、RollbackFor、readOnly

    isolation有五种:
    1、Isolation_Default:默认隔离级别,使用数据库默认的事务隔离级别
    2、Isolation_Read_Uncommitted:读取未提交(可能出现脏读幻读和不可重复读)
    3、Isolation_Read_Committed:读取提交(可能出现幻读不可重复读)
    4、Isolation_Repeatable_Read:可重复读(可能会出现幻读)
    5、Isolation_Serialize:不会出现幻读

    propagation有七种:
    1、propagation_required:代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,
    回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),
    如果没有事务,则自己新建事务,

    2、propagation_supports:代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,
    回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),
    如果没有事务,则该方法在非事务的上下文中执行

    3、propagation_mandatory:代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,
    回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),
    如果没有事务,则抛出异常

    4、propagation_never:只能在非事务中执行,如果当前有事务执行则抛出异常

    5、propagation_nested:如果一个活动的事务存在,则运行在一个嵌套的事务中,
    也就说,这部分方法是外部方法的一部分,调用者回滚,则该方法回滚,
    但如果该方法自己发生异常,则自己回滚,不会影响外部事务如果没有活动
    事务,则按propagation_required属性执行。

    6、propagation_not_supported:总是非事务的执行,并挂起任何存在的事务

    7、propagation_requires_new:创建一个新的事务上下文,如果当前方法的调用者已经有了事务,
    则挂起调用者的事务,这两个事务不处于同一上下文,如果各自发生异常,各自回滚

    propagation_required/propagation_supports/propagation_mandatory三种都需要统一回滚

    propagation_nested/propagation_requires_new各自回滚

    propagation_never/propagation_not_supported不回滚

    参考链接:
    https://blog.csdn.net/liuwenbiao1203/article/details/52439835
    https://blog.csdn.net/linuu/article/details/51006780
    https://www.cnblogs.com/caoyc/p/5632963.html

    相关文章

      网友评论

          本文标题:spring 申明式事务管理

          本文链接:https://www.haomeiwen.com/subject/zquobftx.html