Spring框架--Spring事务管理和Spring事务传播行为
Posted 肖帆咪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架--Spring事务管理和Spring事务传播行为相关的知识,希望对你有一定的参考价值。
Spring框架往期文章
- Spring框架(一)–spring搭建和IOC
- Spring框架(二)–Spring Bean管理
- Spring框架(三)–Spring JDBC
- Spring框架(四)–AOP面向切面编程
- Spring框架(五)–Spring事务管理和Spring事务传播行为
Spring事务管理
事务可以看做是由对数据库若干操作组成的一个单元
作用:保证用户的每一个操作都是可靠地,每一个操作都必须成功,只要发生异常就回退到事务未操作的状态,要么都完成,要么都取消,保证一致性的要求
事物的特性:原子性 隔离性 持久性 一致性
Spring事务管理分两种类型:
1.编程式事务:在代码中需要自己写代码实现事物的提交和回滚
2.声明式事务:只要生命哪个方法需要在事务中执行,Spring就会知道添加事物的提交和回滚操作
Spring事务管理方式:
1.基于xml配置
<1.>xml方式配置
<!--xml方式配置spring对事物管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- spring事务传播行为-->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- save方法需要增强 -->
<aop:pointcut id="save" expression="execution(* com.spring0.dao.UserDao.save(..))"/>
<aop:advisor advice-ref="txadvice" pointcut-ref="save"></aop:advisor>
</aop:config>
2.基于注解实现
<!--xml方式配置spring对事物管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启注解的事务管理-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
通过注解@Transactional 标记需要事务管理得方法,一般在service层进行注解
@Service
//@Transactional//@Transactional添加在类上,表示此类中所有方法都在事务管理中进行
public class Usersrvice
@Autowired
UserDao userDao;
@Transactional
public void save()
userDao.save1();
//System.out.println(10/0);
userDao.save2();
Spring事务传播行为
当一个事务方法被另一个事务方法调用时,这个十五方法应该如何进行.
它是Spring框架独有的事务增强特性,不属于事务实际提供方数据库行为
Spring 定义了七种传播行为:
我们详细介绍三种传播行为
- PROPAGATION_REQUIRED
指定的方法必须在事务内执行,若当前存在事务,加入到当前事务中,若当前没有事务,则创建一个新事务,这种传播行为是最常见的,也是spring 默认的传播行为
A事务方法 调用B事务方法,B的事务会合并到A事务中,若B事务出现异常,A事务也会回滚
A方法(没有事务)调用B事务方法,那么B方法会开启自己的事务,在事务中执行
- PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
A事务方法 调用B方法,那么B方法就会合并到A事务中,若B事务出现异常,A事务也会回滚
A方法(没有事务)调用B方法,那么B方法就不在spring管理的事务中执行(在JdbcTemplate事务执行)
- PROPAGATION_REQUIRES_NEW
总是新建一个事务,如果当前存在事务,把当前事务挂起,直到新建的事务结束
A事务方法 调用B方法,那么B方法会单独开启一个事务执行,A出现异常不影响B方法的事务
A方法(没有事务)调用B方法,那么B还会单独的开启一个事务,A方法的异常不影响B事务
声明式事务不生效的场景
- @Transactional 应用在非 public 修饰的方法上
- @Transactional 注解属性 propagation 设置错误
- 同一个类中方法调用,导致@Transactional 失效
- 异常被 catch 捕获导致@Transactional 失效
- 数据库引擎不支持事
以上是关于Spring框架--Spring事务管理和Spring事务传播行为的主要内容,如果未能解决你的问题,请参考以下文章