news 2026/7/13 11:18:25

(42)事务的两种开发模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(42)事务的两种开发模式

事务的全注解式开发

编写一个类来代替配置文件,代码如下:

packagecom.powernode.bank;importcom.alibaba.druid.pool.DruidDataSource;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.jdbc.datasource.DataSourceTransactionManager;importorg.springframework.transaction.annotation.EnableTransactionManagement;importjavax.sql.DataSource;/** * @author 动力节点 * @version 1.0 * @className Spring6Config * @since 1.0 **/@Configuration@ComponentScan("com.powernode.bank")@EnableTransactionManagementpublicclassSpring6Config{@BeanpublicDataSourcegetDataSource(){DruidDataSourcedataSource=newDruidDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/spring6");dataSource.setUsername("root");dataSource.setPassword("root");returndataSource;}@Bean(name="jdbcTemplate")publicJdbcTemplategetJdbcTemplate(DataSourcedataSource){JdbcTemplatejdbcTemplate=newJdbcTemplate();jdbcTemplate.setDataSource(dataSource);returnjdbcTemplate;}@BeanpublicDataSourceTransactionManagergetDataSourceTransactionManager(DataSourcedataSource){DataSourceTransactionManagerdataSourceTransactionManager=newDataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);returndataSourceTransactionManager;}}

测试程序如下:

@TestpublicvoidtestNoXml(){ApplicationContextapplicationContext=newAnnotationConfigApplicationContext(Spring6Config.class);AccountServiceaccountService=applicationContext.getBean("accountService",AccountService.class);try{accountService.transfer("act-001","act-002",10000);System.out.println("转账成功");}catch(Exceptione){e.printStackTrace();}}

执行结果:

数据库表中数据:

声明式事务之XML实现方式

配置步骤:

  • 第一步:配置事务管理器
  • 第二步:配置通知
  • 第三步:配置切面

记得添加aspectj的依赖:

<!--aspectj依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.0.0-M2</version></dependency>

Spring配置文件如下:
记得添加aop的命名空间。

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scanbase-package="com.powernode.bank"/><beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"><propertyname="driverClassName"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/spring6"/><propertyname="username"value="root"/><propertyname="password"value="root"/></bean><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><propertyname="dataSource"ref="dataSource"/></bean><!--配置事务管理器--><beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><!--配置通知--><tx:adviceid="txAdvice"transaction-manager="txManager"><tx:attributes><tx:methodname="save*"propagation="REQUIRED"rollback-for="java.lang.Throwable"/><tx:methodname="del*"propagation="REQUIRED"rollback-for="java.lang.Throwable"/><tx:methodname="update*"propagation="REQUIRED"rollback-for="java.lang.Throwable"/><tx:methodname="transfer*"propagation="REQUIRED"rollback-for="java.lang.Throwable"/></tx:attributes></tx:advice><!--配置切面--><aop:config><aop:pointcutid="txPointcut"expression="execution(* com.powernode.bank.service..*(..))"/><!--切面 = 通知 + 切点--><aop:advisoradvice-ref="txAdvice"pointcut-ref="txPointcut"/></aop:config></beans>

将AccountServiceImpl类上的@Transactional注解删除。
编写测试程序:

@TestpublicvoidtestTransferXml(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring2.xml");AccountServiceaccountService=applicationContext.getBean("accountService",AccountService.class);try{accountService.transfer("act-001","act-002",10000);System.out.println("转账成功");}catch(Exceptione){e.printStackTrace();}}

执行结果:

数据库表中记录:

通过测试可以看到配置XML已经起作用了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 19:46:14

ITU-T G.723.1 双速率语音编码器技术深度分析与负载特性报告

ITU-T G.723.1 双速率语音编码器技术深度分析与负载特性报告 1. 引言 1.1 背景与标准演进 在数字通信技术飞速发展的20世纪90年代中期&#xff0c;随着互联网的兴起和公共交换电话网络&#xff08;PSTN&#xff09;向分组交换网络的过渡&#xff0c;对于在极低比特率下传输高…

作者头像 李华
网站建设 2026/7/4 5:37:43

YOLO在无人机视觉中的应用:轻量模型+低功耗GPU方案

YOLO在无人机视觉中的应用&#xff1a;轻量模型低功耗GPU方案 在消费级与工业级无人机快速普及的今天&#xff0c;一个核心挑战日益凸显&#xff1a;如何让飞行器“看得清、反应快、能耗低”&#xff1f;尤其是在自主导航、避障和目标追踪等关键任务中&#xff0c;传统基于规则…

作者头像 李华
网站建设 2026/7/3 10:41:57

YOLO在冰川变化监测中的应用:遥感图像分析实践

YOLO在冰川变化监测中的应用&#xff1a;遥感图像分析实践技术背景与核心价值 在全球气候变暖的背景下&#xff0c;冰川加速消融已成为影响海平面、水资源和生态安全的关键变量。传统监测手段依赖人工解译卫星影像或实地勘测&#xff0c;不仅周期长、成本高&#xff0c;还难以应…

作者头像 李华
网站建设 2026/7/3 10:40:58

YOLO模型训练支持CutOut与HideAndSeek图像遮挡增强

YOLO模型训练支持CutOut与HideAndSeek图像遮挡增强 在工业质检、智能监控和自动驾驶等真实场景中&#xff0c;目标被部分遮挡几乎是常态——货架前走过的员工遮住了商品&#xff0c;车流中互相掩映的车辆&#xff0c;或是产线上夹具对零件的覆盖。这些情况对目标检测模型构成了…

作者头像 李华
网站建设 2026/7/3 10:40:09

YOLO模型推理延迟高?可能是你的GPU没配对

YOLO模型推理延迟高&#xff1f;可能是你的GPU没配对 在一条自动化质检产线上&#xff0c;每分钟要处理上千件产品。摄像头以60帧/秒的速度拍摄图像&#xff0c;后台系统必须在16毫秒内完成每一帧的缺陷检测——否则就会漏检、误判&#xff0c;直接导致生产线停摆。工程师部署了…

作者头像 李华
网站建设 2026/7/2 17:57:25

基于python的自然语言处理技术的话题文本分类的研究(源码+文档)

项目简介自然语言处理技术的话题文本分类的研究实现了以下功能&#xff1a;此次设计的功能模块主要有以下的一些内容&#xff1a; &#xff08;1&#xff09;分类模块 在分类模块中&#xff0c; 有两个对话框&#xff0c;一个对话框是可以输入新闻的标题、另一个是新闻的内容&a…

作者头像 李华