Spring 注解版 学习笔记(五)声明式事务

前言:为什么要有事务?为什么要使用事务?下面小编举个例子说明一下吧~

  1. 假设我需要去银行存100块钱,使用ATM自动存款机,在完成准备工作后,将100块钱放到ATM机中,等待完成存款,可是在存款的过程中,ATM机器出现了问题,自动将100块钱退还了出来,但是尽管这次存款失败,在账户上仍然存上了100块钱,这样的过程当然是十分不可取的,在操作数据库中,声明式事务的出现,接管了这种糟糕的事情处理结果,让操作变得更加安全可靠。

1. @Transactional注解:声明事务(标注到方法上)

  1. UserDao
@Repository
public class UserDao {
    @Autowired
    JdbcTemplate jdbcTemplate;

    public void insert(){
        String sql = "INSERT INTO db_user (username, age ) VALUES (?,?)";
        String username = UUID.randomUUID().toString().substring(0, 6);
        jdbcTemplate.update(sql,username,20);
    }
}
  1. Service
    @Resource
    UserDao userDao;
    
    /** 开启事务 */
    @Transactional
    public void insert(){
        userDao.insert();
        log.info("插入方法结束");
    }

2.@EnableTransactionManagement注解:配置文件开启启动事务管理器

配置类:

@Configuration
@ComponentScan("fatcats.top.demo")
@EnableTransactionManagement
public class TxConfig {

    @Bean
    public DataSource dataSource(){
       DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        dataSource.setUrl("jdbc:mysql://localhost:3306/db_info?useSSL=false&serverTimezone=Asia/Shanghai");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() throws Exception{
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
        return jdbcTemplate;
    }
}

3.PlatformTransactionManager组件需要添加到容器中(至关重要)

@Configuration
@ComponentScan("fatcats.top.demo")
@EnableTransactionManagement
public class TxConfig {
    @Bean
    public PlatformTransactionManager transactionManager(){
        return new DataSourceTransactionManager(dataSource());
    }
}

4.测试

在这里插入图片描述
插入完成

在这里插入图片描述

拓展:手动制造异常,查看事务处理方式

  @Transactional
    public void insert(){

        userDao.insert();
        log.info("插入方法结束");

        try {
            int i = 10 / 0;
        }catch (Exception e){
            throw new RuntimeException("手动抛出异常~");
        }
    }

测试:

在这里插入图片描述
可想而知,已经发生了回滚,数据库肯定是没有添加数据的

在这里插入图片描述
补充:再次插入一条正常流程数据

在这里插入图片描述
这里发现他的自增长ID变成了3,说明数据虽然没有被插入进去,但是id其实已经自增1了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值