当前位置: 首页 > news >正文

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

这里写自定义目录标题

    • 一、使用 transactionManager
      • 1、向容器中注入事务管理器
      • 2、使用 transactionManager 提交事务
      • 3、测试
    • 二、使用TransactionTemplate
      • 1、向容器中注入 TransactionTemplate
      • 2、开启事务

一、使用 transactionManager

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

@Configuration  //配置类
public class SpringConfig {@Beanpublic 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;}@Beanpublic DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}

2、使用 transactionManager 提交事务

    @Overridepublic void buyBook1(Integer bookId, Integer userId) {// 开启事务TransactionDefinition definition = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(definition);try {//根据图书id查询图书价格Integer price = bookDao.getBookPriceByBookId(bookId);//更新图书表库存量 -1bookDao.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 {@Beanpublic 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;}@Beanpublic DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}@Beanpublic TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {return new TransactionTemplate(transactionManager);}
}

2、开启事务

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

相关文章:

  • cv的优势
  • 基于某评论的TF-IDF下的LDA主题模型分析
  • 四、Nginx配置文件-负载均衡
  • ofd文件预览
  • 浅浅了解下Spring中生命周期函数(Spring6全攻略)
  • 建议收藏!亚马逊卖家必须知道的37个常用术语解释
  • 黑苹果睡眠总是自动唤醒(RTC)
  • 【代码随想录训练营】【Day 49+】【动态规划-8】| Leetcode 121, 122, 123
  • k8s metrics-server服务监控pod 的 cpu、内存
  • 电脑自带录屏在哪?电脑录屏,4个详细方法
  • [Cloud Networking] Layer3 (Continue)
  • missing authentication credentials for REST request
  • Unity 从0开始编写一个技能编辑器_02_Buff系统的生命周期
  • 计算机网络简答题
  • 探索Java 8 Stream API:现代数据处理的新纪元
  • vim 删除光标到最后一行的所有内容
  • k8s之kubelet证书时间过期升级
  • 5G消息 x 文旅 | 一站式智慧文旅解决方案
  • 如何评估员工在新版FMEA培训后应用知识的效果?
  • python脚本之解析命令参数
  • 当JS遇上NLP:开启图片分析的奇幻之旅
  • trpc快速上手
  • 知识图谱存在的挑战---隐私、安全和伦理相关和测试认证相关
  • 课时155:脚本发布_简单脚本_命令罗列
  • 借助ollama实现AI绘画提示词自由,操作简单只需一个节点!
  • PyTorch -- Visdom 快速实践
  • 基于xilinx FPGA的QSFP调试使用经验
  • WPF 使用Image控件显示图片
  • 合肥工业大学内容安全实验一:爬虫|爬新闻文本
  • 自动驾驶---Perception之视觉点云雷达点云