在Spring中如何手动开启事务(使用编程式事务)

一、使用 transactionManager

1、向容器中注入事务管理器

@Configuration  //配置类
public class SpringConfig {

    @Bean
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("houchen");
        dataSource.setUrl("jdbc:mysql://192.168.239.11:3306/atguigu_spring6?characterEncoding=utf8&useSSL=false");
        return dataSource;
    }

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

2、使用 transactionManager 提交事务

    @Override
    public void buyBook1(Integer bookId, Integer userId) {
		// 开启事务
        TransactionDefinition definition = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(definition);

        try {
            //根据图书id查询图书价格
            Integer price = bookDao.getBookPriceByBookId(bookId);
            //更新图书表库存量 -1
            bookDao.updateStock(bookId);
            System.out.println(1 / 0);
            //更新用户表用户余额 -图书价格
            bookDao.updateUserBalance(userId, price);
            // 提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
        }
    }

3、测试

发起请求后,报错了,但是数据库的数据并没有发生修改



二、使用TransactionTemplate

1、向容器中注入 TransactionTemplate

@Configuration  //配置类
@ComponentScan("com.atguigu.spring6.tx")
public class SpringConfig {

    @Bean
    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("houchen");
        dataSource.setUrl("jdbc:mysql://192.168.239.11:3306/atguigu_spring6?characterEncoding=utf8&useSSL=false");
        return dataSource;
    }

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

    @Bean
    public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
        return new TransactionTemplate(transactionManager);
    }
}

2、开启事务

  @Override
    public void buyBook2(Integer bookId, Integer userId) {

        transactionTemplate.execute(transactionStatus -> {
            //根据图书id查询图书价格
            Integer price = bookDao.getBookPriceByBookId(bookId);
            //更新图书表库存量 -1
            bookDao.updateStock(bookId);
            System.out.println(1 / 0);
            //更新用户表用户余额 -图书价格
            bookDao.updateUserBalance(userId, price);
            return null;
        });
    }

相关推荐

  1. Spring如何手动开启事务使用程式事务

    2024-06-14 10:58:05       28 阅读
  2. Spring Boot 使用事务

    2024-06-14 10:58:05       52 阅读
  3. 【源码】SpringBoot程式事务使用及执行原理

    2024-06-14 10:58:05       25 阅读
  4. Spring事务失效的场景

    2024-06-14 10:58:05       48 阅读
  5. Spring事务如何实现的?

    2024-06-14 10:58:05       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 10:58:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 10:58:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 10:58:05       82 阅读
  4. Python语言-面向对象

    2024-06-14 10:58:05       91 阅读

热门阅读

  1. 【Go】十三、TOKEN机制与跨域处理方式

    2024-06-14 10:58:05       23 阅读
  2. Python类,面向对象详解

    2024-06-14 10:58:05       25 阅读
  3. windows命令帮助大全

    2024-06-14 10:58:05       20 阅读
  4. Codeforces Round 952 (Div. 4)

    2024-06-14 10:58:05       29 阅读
  5. 2024.6.13 刷题总结

    2024-06-14 10:58:05       29 阅读
  6. MySql几十万条数据,同时新增或者修改

    2024-06-14 10:58:05       26 阅读
  7. ELasticSearch数据迁移方案-elasticdump

    2024-06-14 10:58:05       26 阅读
  8. 前端针对需要递增的固定数据

    2024-06-14 10:58:05       26 阅读
  9. 如果用户访问的是没有页面的路由跳转到404

    2024-06-14 10:58:05       22 阅读
  10. Spring源码学习-Resource

    2024-06-14 10:58:05       29 阅读
  11. 行列视(RCV)能解决哪些问题?

    2024-06-14 10:58:05       24 阅读
  12. easyExcel导入日期LocalDateTime等类型不匹配问题

    2024-06-14 10:58:05       30 阅读
  13. milvus的磁盘索引

    2024-06-14 10:58:05       30 阅读