首页 > 其他分享 >spring-事务

spring-事务

时间:2023-09-15 12:34:33浏览次数:55  
标签:事务 spring Transactional 回滚 druidDataSource 注解 wind

声明式事务

指使用注解或 XML 配置的方式来控制事务的提交和回滚

Spring声明式事务准备工作

1. 配置环境

<!-- 声明式事务依赖-->
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.22</version>
        </dependency>
<!--AOP-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.22</version>
        </dependency>
<!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
</dependency>
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.22</version>
        </dependency>

2. 外部配置文件

jdbc.properties

wind.url=jdbc:mysql://localhost:3306/studb
wind.driver=com.mysql.cj.jdbc.Driver
wind.username=root
wind.password=root
#尽量加前缀  xx.url  避免报错

3. spring配置类

@Component
@Configuration //声明 配置类
@ComponentScan("com.wind") // 包扫描
@PropertySource("classpath:jdbc.properties")//引入配置文件 注解
@EnableTransactionManagement //开启事务注解 的支持
public class JavaConfig {

    @Bean //实例化dataSource加入到ioc容器
    public DruidDataSource dataSource(@Value("${wind.url}") String url,
                                      @Value("${wind.driver}") String driver,
                                      @Value("${wind.username}") String username,
                                      @Value("${wind.password}") String password) {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }

    @Bean //实例化JdbcTemplate对象,需要使用ioc中的DataSource
    public JdbcTemplate jdbcTemplate(DruidDataSource druidDataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(druidDataSource);
        return jdbcTemplate;
    }

    @Bean //装配事务管理实现对象
    public TransactionManager dataSourceTransactionManager(DruidDataSource druidDataSource) {
        // 内部进行事务操作  基于连接池
        DataSourceTransactionManager dataSourceTransactionManager =
                new DataSourceTransactionManager();
        //需要连接池对象
        dataSourceTransactionManager.setDataSource(druidDataSource);
        return dataSourceTransactionManager;
    }
}

哪些类需要事务,使用声明事务注解@Transactional

@Service
public class StudentService {
    @Autowired //自动装配
    private StudentDao studentDao;

    @Transactional
    public void changeInfo(){
        studentDao.updateAgeById(100,1);
        System.out.println("-----------");
        int i = 1/0;
        studentDao.updateNameById("test1",1);
    }
}

事务属性 -->只读 @Transactional(readOnly = true) 把当前事务设置为只读 默认是false!

声明 事务注解 一般我们将 事务 注解加入到类上
这样类中的方法都具有事务
在类级别@Transactional注解中设置只读,这样类中所有的查询方法都不需要设置@Transactional注解
然后在这个基础上,对增删改方法设置@Transactional注解 readOnly 属性为 false

事务属性 -->超时时间 @Transactional(timeout = 3)

事务在执行过程中,有可能因为遇到某些问题,导致程序卡住,从而长时间占用数据库资源。而长时间占用资源,大概率是因为程序运行出现了问题(可能是Java程序或MySQL数据库或网络连接等等)
此时这个很可能出问题的程序应该被回滚,撤销它已做的操作,事务结束,把资源让出来,让其他正常程序可以执行 (超时回滚,释放资源)
timeout设置事务超时时间,单位秒! 默认: -1 永不超时,不限制事务时间

事务属性 -->事务异常 @Transactional(rollbackFor = Exception.class)

事务异常分为: 指定异常回滚 指定异常不会滚
指定异常回滚 默认是 RuntimeException and Error 异常方可回滚
为了控制事物的回滚 我们可以将 事务异常的范围放大 实现控制事务异常 指定回滚
@Transactional(rollbackFor = Exception.class)
而 noRollbackFor 这个属性 则是在控制范围内 指定某个特定的异常发生时 不会回滚

事务属性 -->事务隔离级别设置 @Transactional(isolation = Isolation.READ_COMMITTED)

数据库事务的隔离级别是指在多个事务并发执行时,数据库系统为了保证数据一致性所遵循的规定。常见的隔离级别包括:

  1. 读未提交(Read Uncommitted):事务可以读取未被提交的数据,容易产生脏读、不可重复读和幻读等问题。实现简单但不太安全,一般不用。
  2. 读已提交(Read Committed):事务只能读取已经提交的数据,可以避免脏读问题,但可能引发不可重复读和幻读。
  3. 可重复读(Repeatable Read):在一个事务中,相同的查询将返回相同的结果集,不管其他事务对数据做了什么修改。可以避免脏读和不可重复读,但仍有幻读的问题。
  4. 串行化(Serializable):最高的隔离级别,完全禁止了并发,只允许一个事务执行完毕之后才能执行另一个事务。可以避免以上所有问题,但效率较低,不适用于高并发场景。
    不同的隔离级别适用于不同的场景,需要根据实际业务需求进行选择和调整

事务属性 -->事务传播行为 @Transactional(propagation = Propagation.REQUIRES_NEW)

在被调用的子方法中设置传播行为,代表如何处理调用的事务! 是加入,还是新事务等
@Transactional 注解通过 propagation 属性设置事务的传播行为
REQUIRED : 默认值 如果父方法有事务,就加入,如果没有就新建自己独立
REQUIRES_NEW : 不管父方法是否有事务,我都新建事务,都是独立的

注意事项:

在同一个类中,对于@Transactional注解的方法调用,事务传播行为不会生效。这是因为Spring框架中使用代理模式实现了事务机制,在同一个类中的方法调用并不经过代理,而是通过对象的方法调用,因此@Transactional注解的设置不会被代理捕获,也就不会产生任何事务传播行为的效果

标签:事务,spring,Transactional,回滚,druidDataSource,注解,wind
From: https://www.cnblogs.com/weifengfuxiufa/p/17704766.html

相关文章

  • 基于 COLA 架构的 Spring Cloud Alibaba(四)整合 Sentinel
    在上一篇中,我们介绍了在项目中如何整合Nacos、OpenFeign。这一篇,我们来介绍一下项目中Sentinel的整合。1.关于SentinelSentinel是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel把流量作为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。Sentinel的使......
  • SpringBoot拦截器和动态代理有什么区别?
    在SpringBoot中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候,有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层实现。1.拦截器拦截器(Interceptor)准确来说在SpringMVC中的一个很重要的组件,用于拦截Controller的请......
  • Spring框架开发WebService的环境搭建
    如题。这里只介绍基本的运行环境搭建。所需IDE或编辑器,自行准备。笔者所有的职业开发者朋友都建议使用IDEA旗舰版(收费)。建议次选VsCode。eclipse、myeclipse这些再次。环境:1、JDK20。javaer都清楚的东西,不赘述。2、maven。很流行的依赖管理工具,在学习开发中顺手拿来编译运行也......
  • spring5.0.1jar包作用
    spring-core.jar(必须):这个jar文件包含Spring框架基本的核心工具类。Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。外部依赖CommonsLogging,(Log4J)。spring-beans.jar(必须):这个jar文件是所有应用都要用到的,它包......
  • 深入浅出:SPI机制在JDK与Spring Boot中的应用
    本文分享自华为云社区《Spring高手之路14——深入浅出:SPI机制在JDK与SpringBoot中的应用》,作者:砖业洋__。SpringBoot不仅是简化Spring应用开发的工具,它还融合了许多先进的机制。本文深入探讨了SpringBoot中与Java的标准SPI相似的机制,揭示了它的工作原理、应用场景及与标准SPI的......
  • 布式事务的三种方案
    布式事务的三种方案 问题描述:用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。由库存服务去维护库存数据库的信息。下图是系统结构图: 如何实现两个分布式服务(订单服务、库存服务)共同完成一件事即订单支付成功自动减库存,这里的关键是如何......
  • SpringBoot 自定义starter汇总
    1、SpringBootstarter机制SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息......
  • 「Java开发指南」在MyEclipse中的Spring开发(二)
    在上文中(点击这里回顾>>),我们主要介绍了一些Spring的基本概念、Spring项目配置及向导,本章节将继续介绍如何管理多个项目,Spring配置编辑器等,欢迎持续关注~MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论4.管理多个Beans和项目除了使用bean配置文......
  • springmvc中设置请求方式的转换,将post请求转换为put与delete,需要在web.xml中设置过滤
    2023-09-15web.xml<!--请求方式过滤器--><filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter......
  • SpringBoot打成jar运行后无法读取resources里的文件
    开发一个word替换功能时,因替换其中的内容功能需要word模版,就把word_replace_tpl.docx模版文件放到resources下在开发环境中通过下面方法能读取word_replace_tpl.docx文件,但是打成jar包在linux下运行后无法找到文件了Filefile=ResourceUtils.getFile(ResourceUtils.CL......