news 2026/5/1 8:35:37

(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/4/21 14:51:00

YOLO模型训练支持AutoAugment自动数据增强策略

YOLO模型训练支持AutoAugment自动数据增强策略 在工业质检、智能监控和自动驾驶等现实场景中&#xff0c;目标检测模型常常面临光照突变、视角偏移、遮挡严重等复杂干扰。即便使用了YOLO这样以高效著称的检测框架&#xff0c;一旦训练数据缺乏多样性&#xff0c;模型依然容易在…

作者头像 李华
网站建设 2026/4/23 19:20:51

Compose笔记(六十四)--LottieAnimation

这一节主要了解一下Compose中的LottieAnimation&#xff0c;在Jetpack Compose中&#xff0c;LottieAnimation是一个用于渲染Lottie动画的Composable组件。它由Lottie-Android库提供支持&#xff0c;允许开发者在Android应用中轻松展示复杂的动画效果.简单总结如下:API: compos…

作者头像 李华
网站建设 2026/5/1 7:09:57

计算机毕业设计springboot旅游景点管理系统 基于SpringBoot的智慧文旅综合服务平台 融合SpringBoot的景区一站式预约与信息管理系统

计算机毕业设计springboot旅游景点管理系统2fj40iq6 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“来一场说走就走的旅行”从口号变成日常&#xff0c;景区却还在用Excel电…

作者头像 李华
网站建设 2026/4/19 23:56:16

YOLO模型训练支持DataParallel多GPU并行(单机)

YOLO模型训练支持DataParallel多GPU并行&#xff08;单机&#xff09; 在工业视觉系统日益智能化的今天&#xff0c;目标检测模型的迭代速度直接决定了产品落地的节奏。YOLO系列作为实时检测领域的“标配”&#xff0c;其训练效率问题愈发突出——当使用COCO这样的大规模数据集…

作者头像 李华
网站建设 2026/5/1 8:33:39

YOLO模型训练支持ReduceLROnPlateau动态调整学习率

YOLO模型训练支持ReduceLROnPlateau动态调整学习率 在工业视觉系统日益复杂的今天&#xff0c;一个常见的挑战是&#xff1a;如何让YOLO这类高速目标检测模型在有限的训练周期内&#xff0c;既快速收敛又不牺牲最终精度&#xff1f;许多工程师都经历过这样的场景——训练前期损…

作者头像 李华