spring 申明式事务管理

2018-08-16  本文已影响0人  代码potty

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

上一篇下一篇

猜你喜欢

热点阅读