03. Spring 事务管理

1. Spring 事务管理简介

事务管理是应用系统开发中必不可少的一部分,Spring 为事务管理提供了丰富的功能。Spring 的事务管理分为编程式和声明式两种方式。声明式事务管理可以使业务代码逻辑不受污染,将业务逻辑和事务处理解耦。声明式事务也有两种方式:一种是在配置文件(xml)中做相关的事务规则声明,一种是基于注解 @Transactional 的方式

事务是数据库的概念,Spring 本身是没有事务的,Spring 的事务是借助 AOP,通过动态代理的方式实现。
在我们要操作数据库的时候,实际是 Spring 通过动态代理进行功能拓展,在我们的代码操作数据库之前通过数据库客户端打开数据库事务,如果代码执行完毕没有异常信息或者是没有 Spring 要捕获的异常信息时,再通过数据库客户端提交事务;如果有异常信息或者是有 Spring 要捕获的异常信息,再通过数据库客户端程序回滚事务,从而控制数据库事务。

Spring 基于注解使用事务主要有两步:

  • 在主配置类上声明 @EnableTransactionManagement 注解,表示开启声明式事务;
  • 在访问数据库的方法上添加 @Transactional 注解。

@Transactional 注解也可以用在类上,表示该类的所有公共方法都配置相同的事务属性。如果类和方法都配置了 @Transactional,应用程序会用方法级别的事务属性来管理事务。

2. @Transactional 注解属性信息

属性名 说明
name 当配置文件中有多个 TransactionManager时,可以用该属性指定选择哪个事务管理器
propagation 事务的传播行为,默认值:REQUIRED
isolation 事务的隔离度,默认值:DEFAULT
timeout 事务的超时时间,默认值 -1。如果超过该时间但事务未完成,则回滚该事务
readOnly 指定事务为只读事务,默认值 false。指定当前事务为只读事务后,当前事务不能进行写操作,否则报错
rollbackFor 指定能够触发事务回滚的异常类型,如果有多个异常类型要指定,用逗号分隔
noRollbackFor 抛出该参数指定的异常类型,不回滚事务

3. @Transactional 简单使用

如下有一个保存数据的方法,加上 @Transactional 注解,运行时抛出运行时异常之后,事务会自动回滚,数据不会插入数据库。

    @Override
    @Transactional
    public boolean save() {
   
        boolean res = stateRepository.save();
        if(true) {
   
            throw new RuntimeException();
        }
        return res;
    }
  • 如果去掉 @Transactional 注解,save() 就是一个普通的没有事务的方法,执行时还是会抛出异常,但是会插入数据。
  • 如果加上 @Transactional 注解,但是在方法内使用 try-catch 捕获异常,则事务不会回滚,数据会插入成功。
        @Override
        @Transactional
        public boolean save() {
         
            boolean res &
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值