spring 申明式事务管理
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