SpringBoot实战笔记:24_Spring Boot 的事务支持

24_Spring Boot 的事务支持
  • 所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务,提交事务来完成数据操作,或者在发生错误的时候回滚数据。
  • Spring 的事务机制是用统一的机制来处理不同的数据访问技术的事务处理。
  • Spring 的事务机制提供了一个 PlatformTransactionManager 接口,不同的数据访问技术的事务使用不同的接口实现。
数据访问技术实现类
JDBCDataSourceTransactionManager
JPAJpaTransactionManager
HibernateHibernateTransactionManager
JDOJdoTransactionManager
分布式事务JtaTransactionManager

定义事务管理器的代码如下

@Bean
public PlatformTransactionManager transactionManager(){
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setDataSource(dataSource());
    return transactionManager;
}
1,声明式事务

Spring 支持声明式事务,即使用注解来选择需要使用事务的方法(切入点),它使用 @Transactional 注解在方法上,声明该方法需要事务支持,这是一个基于 AOP 的实现操作。

@Transactional 注解是 org.springframework.transaction.annotation 包下的

Spring 提供了一个 @EnableTransactionManager 注解,在配置类上来开启声明式事务的支持。会自动扫注解 @Transactional 的方法和类(表示该类中所有public的方法都需要开启事务的)。

2,Spring Data JPA 的事务支持

Spring Data JPA 对所有的默认方法都开启了事务支持,且查询类事务默认启用 readOnly=true 属性。
可以查看 SimpleJpaRepository 类的源码


3,Spring Boot 的事务支持:自动配置的事务管理器
  • 在使用JDBC作为数据访问技术的时候,Spring Boot 为我们定义了 PlatformTransactionManager 的实现 DataSourceTransactionManager 的Bean;
  • 在使用JPA作为数据访问技术的时候,Spring Boot 为我们定义了 PlatformTransactionManager 的实现 JpaTransactionManager 的Bean;
4,Spring Boot 的事务支持:自动开启注解事务的支持
  • Spring Boot 专门用于配置事务的类为 :TransactionAutoConfiguration,此配置类依赖于 JpaBaseConfigurationDataSourceTransactionManagerAutoConfiguration
  • DataSourceTransactionManagerAutoConfiguration 里开启了对声明式事务的支持
  • 所以在 Spring Boot中,无需显示的开启使用 @EnableTransactionManager 注解
5,新建Spring Boot 项目:演示使用异常导致事务回滚
  • 导入 webjpa 依赖
  • 添加 ojdbc6.jar 依赖,在 application.properties 文件中添加配置
6,创建实体类Person
  • 属性:id(主键、自增),name,address,age
  • 空参数构造方法,set/get方法
  • 别忘了在类上注解 :@Entity
7,创建实体类的Repository接口(DAO)
public interface PersonRepository extends JpaRepository<Person,Long>{

}
8,创建对应的Service 层
package com.zyf.service;

import com.zyf.domain.Person;

/**
 * Created by zyf on 2018/3/13.
 */
public interface PersonService {
    /**
     * 演示回滚
     */
    Person savePersonWithRollBack(Person person);

    /**
     * 演示不会滚
     */
    Person savePersonWithoutRollBack(Person person);
}
package com.zyf.service.impl;

import com.zyf.dao.PersonRepository;
import com.zyf.domain.Person;
import com.zyf.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created by zyf on 2018/3/13.
 */
@Service
public class PersonServiceImpl implements PersonService {

    @Autowired
    PersonRepository personRepository;

    //通过rollbackfor属性指定:出现该异常则数据回滚
    @Transactional(rollbackFor = {IllegalArgumentException.class})
    @Override
    public Person savePersonWithRollBack(Person person) {
        Person p = personRepository.save(person);
        if(person.getName().equals("zyf")){
            throw new IllegalArgumentException("不好意思不能存,回滚啦");
        }
        return p;
    }

    //通过noRollbackFor属性指定:出现该异常则数据不回滚
    @Transactional(noRollbackFor = {IllegalArgumentException.class})
    @Override
    public Person savePersonWithoutRollBack(Person person) {
        Person p = personRepository.save(person);
        if(person.getName().equals("zyf")){
            throw new IllegalArgumentException("不好意思不能存,回滚啦");
        }
        return p;
    }
}
9,控制器
package com.zyf.controller;

import com.zyf.domain.Person;
import com.zyf.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by zyf on 2018/3/13.
 */
@Controller
public class PersonController {

    @Autowired
    PersonService personService;

    @RequestMapping("/rollback")
    public Person rollback(Person person){
        return personService.savePersonWithRollBack(person);
    }

    @RequestMapping("/norollback")
    public Person noRollback(Person person){
        return personService.savePersonWithoutRollBack(person);
    }
}
10,测试

访问不回滚

依然存进去了

访问回滚的话数据库中是不会插入新数据的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
当前课程中博客项目的实战源码是我在 GitHub上开源项目 My-Blog,目前已有 3000 多个 star:本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 个人博客项目功能的讲解,通过本课程的学习,不仅仅让你掌握基本的 Spring Boot 开发能力以及 Spring Boot 项目的大部分开发使用场景,同时帮你提前甄别和处理掉将要遇到的技术难点,认真学完这个课程后,你将会对 Spring Boot 有更加深入而全面的了解,同时你也会得到一个大家都在使用的博客系统源码,你可以根据自己的需求和想法进行改造,也可以直接使用它来作为自己的个人网站,这个课程一定会给你带来巨大的收获。作者寄语本课程录制于 2020 年,代码基于 Spring Boot 2.x 版本。到目前为止,Spring Boot 技术栈也有一些版本升级,比如 Spring Boot 2.7 发版、Spring Boot 3.x 版本发布正式版本。对于这些情况,笔者会在本课程实战项目的开源仓库中创建不同的代码分支,保持实战项目的源码更新,保证读者朋友们不会学习过气的知识点。课程特色 课程内容紧贴 Spring Boot 技术栈,涵盖大部分 Spring Boot 使用场景。开发教程详细完整、文档资源齐全、实验过程循序渐进简单明了。实践项目页面美观且实用,交互效果完美。包含从零搭建项目、以及完整的后台管理系统和博客展示系统两个系统的功能开发流程。技术栈新颖且知识点丰富,学习后可以提升大家对于知识的理解和掌握,对于提升你的市场竞争力有一定的帮助。实战项目预览    

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值