• 在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;
            });
        }
    
  • 相关阅读:
    antdesignvue数字输入框限制只能输入整数
    Swift的NSClassFromString转换
    极智资讯 | 一文看尽今年的云栖大会 有哪些好玩的
    Linux 学习笔记:Linux MISC 驱动
    Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】
    敏捷实践之Bug Bash
    Lucene-MergePolicy详解
    C++ Tutorials: C++ Language: Compound data types: Character sequences
    HashMap/ConcurrentHashMap/头插法/尾插法
    QT基础教程(QDebug和QString)
  • 原文地址:https://blog.csdn.net/hc1285653662/article/details/139665343