Spring-事务相关

本文详细介绍了Spring中的事务管理,包括事务的作用、Spring事务的实现步骤(注解式事务、设置事务管理器和开启注解式事务驱动)、事务角色(管理员和协调员)以及事务属性(如传播行为、隔离级别和回滚规则)。
摘要由CSDN通过智能技术生成

Spring-事务相关

一、事务简介

  • 事务作用:在数据层保障一系列的数据库操作同时成功/失败;
  • Spring事务作用:在数据层或业务层保障一系列的数据库操作同时成功/失败;

二、Spring事务的实现

  • Spring实现事务的步骤:

    • 1.业务层(service)接口上添加Spring事务管理:使用注解@Transactional方式

      • 注解式事务添加在业务层接口上而不会添加到业务层实现类中,降低耦合;
      • 注解式事务添加在业务层接口上:表示该接口的所有实现方法均开始事务管理;
      public interface AccountService {
          @Transactional
          public void transfer(String out, String in, Double money);
      
      }
      
    • 2.设置事务管理器

      • 在jdbc配置类中设置事务管理器;
      @PropertySource("classpath:jdbc.properties") //配置引入的properties文件路径
      public class JdbcConfig {
      	......
          //设置事务管理器
          @Bean
          public PlatformTransactionManager getTransactionManager(DataSource dataSource){
              DataSourceTransactionManager ptm = new DataSourceTransactionManager();
              ptm.setDataSource(dataSource);
              return ptm;
          }
      }
      
    • 3.开启注解式事务驱动

      @Configuration //声明该类为配置类
      @ComponentScan({"com.sea"}) //配置bean扫描的包路径
      @Import({JdbcConfig.class, MybatisConfig.class}) //引入其他配置类
      @EnableTransactionManagement //开启注解式事务驱动
      public class SpringConfig {
      
      }
      

三、Spring事务角色

  • 事务角色包括:

    • 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法;

      • 例如:

        @Transactional
        public void transfer(String out, String in, Double money);
        
    • 事务协调员:加入事务方,在Spring中通常指代数据层的方法,也可以是业务层方法;

      • 例如:

        @Repository
        public interface AccountDao {
            @Update("update tb_account set money = money + #{money} where name = #{name}")
            void inMoney(@Param("name") String name, @Param("money") Double money);
            @Update("update tb_account set money = money - #{money} where name = #{name}")
            void outMoney(@Param("name") String name, @Param("money") Double money);
        }
        

四、Spring事务属性

4.1 事务属性介绍

  • 按住Ctrl+鼠标左键点击注解@Transactional进入Spring事务注解的属性信息:

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Transactional {
        @AliasFor("transactionManager")
        String value() default "";
    
        @AliasFor("value")
        String transactionManager() default "";
    
        Propagation propagation() default Propagation.REQUIRED;
    
        Isolation isolation() default Isolation.DEFAULT;
    
        int timeout() default -1;
    
        boolean readOnly() default false;
    
        Class<? extends Throwable>[] rollbackFor() default {};
    
        String[] rollbackForClassName() default {};
    
        Class<? extends Throwable>[] noRollbackFor() default {};
    
        String[] noRollbackForClassName() default {};
    }
    
    属性作用
    value
    propagation设置事务的传播行为,默认为Propagation.REQUIRED
    isolation设置事务的隔离程度,默认为Isolation.DEFAULT
    timeout设置事务超时时间,默认为-1
    readOnly设置是否为只读事务,默认为false
    rollbackFor设置事务回滚异常【参数为xxx.class】
    rollbackForClassName设置事务回滚异常【参数为"xxx.class"】
    noRollbackFor设置事务不回滚异常【参数为xxx.class】
    noRollbackForClassName设置事务不回滚异常【参数为"xxx.class"】
  • 注意:Spring事务异常回滚仅在捕获运行时异常以及error时回滚!也可以通过rollbackFor属性指定某种异常也会回滚;

4.2 事务属性的使用场景

  • 前提:@Transactional注解只有应用到public方法,才能进行事务管理!

  • 设置只读事务

    @Transactional(readOnly = true)
    public void transfer(String out, String in, Double money);
    
  • 设置事务超时时间(单位:秒)

    @Transactional(readOnly = true, timeout = 5)
    public void transfer(String out, String in, Double money);
    
  • 设置捕捉到某种指定异常也进行事务回滚

    @Transactional(readOnly = true, timeout = 10, rollbackFor = IOException.class)
    public void transfer(String out, String in, Double money);
    
    @Transactional(readOnly = true, timeout = 10, rollbackForClassName = "IOException.class")
    public void transfer(String out, String in, Double money);
    
  • 设置事务传播行为:

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SEA-365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值