Spring中的事务

spring事务

1、spring事务简介

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

1.1、转账案例:

  • 业务层接口

    /**
     * @author: anle
     * @date: 2023/04/09 10:38
     *
     * 转账接口
     **/
    public interface AccountService {
    
        /*
        * out 转出方法
        * in  转入方法
        * money 金额
        *
        * */
        @Transactional
        public void transfer(String out,String in ,Double money);
    }
    
  • 数据层接口:

    /**
     * @author: anle
     * @date: 2023/04/09 10:42
     **/
    public interface AccountDao {
    
        @Update("update user_money set money =money+ #{money} where name = #{name}")
        void inMoney(@Param("name") String name,@Param("money") Double money );
    
        @Update("update user_money set money = money - #{money} where name = #{name}")
        void outMoney(@Param("name") String name ,@Param("money") Double money);
    }
    
  • 业务层实现类:

    /**
     * @author: anle
     * @date: 2023/04/09 10:50
     **/
    
    @Service
    public class AccountServiceImpl implements AccountService {
        private AccountDao accountDao;
        @Autowired
        public void setAccountDao(AccountDao accountDao) {
            this.accountDao = accountDao;
        }
    
    
    
        @Override
        public void transfer(String out, String in, Double money) {
            accountDao.outMoney(out,money);
            //int i = 1/0;
            accountDao.inMoney(in,money);
        }
    }
    
  • jdbc配置类

    /**
     * @Author: AnLe
     * @Date: 2023/03/31/9:46
     */
    
    public class jdbcConfig {
        //1、定义一个方法获得要管理的对象
        //2、@Bean、表示当前方法的返回值是一个bean
        @Value("com.mysql.jdbc.Driver")
        private String driver;
        @Value("jdbc:mysql://localhost:3306/sping-stu")
        private String url;
        @Value("root")
        private String username;
        @Value("123456")
        private String password;
    
    
        @Bean
        public DataSource dataSource(){
            DruidDataSource ds = new DruidDataSource();
            ds.setDriverClassName(driver);
            ds.setUrl(url);
            ds.setUsername(username);
            ds.setPassword(password);
            return ds;
        }
    
        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource){
            DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
            transactionManager.setDataSource(dataSource);
    
            return transactionManager;
        }
    
    }
    
  • mybatis配置类

    /**
     * @Author: AnLe
     * @Date: 2023/03/31/9:52
     */
    public class MybatisConfig {
    
        @Bean
        public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
            SqlSessionFactoryBean sfb = new SqlSessionFactoryBean();
            sfb.setTypeAliasesPackage("com.anle.domain");
            sfb.setDataSource(dataSource);
            return sfb;
        }
    
        @Bean
        public MapperScannerConfigurer mapperScannerConfigurer(){
            MapperScannerConfigurer msc = new MapperScannerConfigurer();
            msc.setBasePackage("com.anle.dao");
            return msc;
        }
    }
    
  • spring配置类

    /**
     * @Author: AnLe
     * @Date: 2023/03/31/9:19
     */
    
    @Configuration
    @ComponentScan("com.anle")
    @PropertySource({"jdbc.properties"})
    @Import({jdbcConfig.class,MybatisConfig.class})
    @EnableTransactionManagement
    public class SpringConfig {
    }
    
  • 实体类:

    /**
     * @author: anle
     * @date: 2023/04/09 10:57
     **/
    public class Account {
        private int id;
        private String name;
        private Double money;
        
        //get 和set方法
    
  • jdbc数据源:

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/sping-stu?serverTimezone=UTC
    jdbc.username=root
    jdbc.password=123456
    
  • 测试类:

    /**
     * @author: anle
     * @date: 2023/04/09 10:53
     **/
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = SpringConfig.class)
    public class MoneyTest {
    
        @Autowired
        private AccountService accountService;
    
        @Test
        public void testTransfer(){
            accountService.transfer("张三","李四", 200d);
    
        }
    
    
    }
    
  • 整体结构:

    image-20230409111919768

  • 实现spring事务需要以下步骤:

    1. 在业务层接口上增加spring事务管理器

         @Transactional
          public void transfer(String out,String in ,Double money);
      }
      

      注意事项:spring注解事务增加到业务层接口中而不会增加到业务层实现类中,降低偶合

      ​ 注解式事务开发可以增加到业务层方法上表示当前方法开启事务,也可以增加到接 口上表示当前接口所有方法开启事务。

      2.设置事务管理器:

      @Bean
      public PlatformTransactionManager transactionManager(DataSource dataSource){
          DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
          transactionManager.setDataSource(dataSource);
      
          return transactionManager;
      }
      

      注意事项:事务管理要根据实现技术进行选择

      ​ mybatis框架使用jdbc事务

      3.开启注解式事务驱动:

      @EnableTransactionManagement
      public class SpringConfig {
      }
      

2、spring事务角色

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

  • 事务协调员:加入事务方,在spring中通常指代数据层方法,也可以是业务层方法

    image-20230411082001849

3、事务配置

  • 事务中的常见配置

image-20230411082045133

4、事务传播行为

image-20230411090003821

2、spring事务角色

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

  • 事务协调员:加入事务方,在spring中通常指代数据层方法,也可以是业务层方法

    [外链图片转存中…(img-nofPvO83-1684156086347)]

3、事务配置

  • 事务中的常见配置

[外链图片转存中…(img-UriyVedn-1684156086348)]

4、事务传播行为

[外链图片转存中…(img-yIZCAaof-1684156086348)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值