6.3、使用Spring的声明式事务管理(DEMO)

Spring事务小demo 这是一个Spring+Mybatis+Mysqls的Java程序,主要是用来学习Spring的事务的,感兴趣的可以下载。 立即下载

目录

1、依赖引入(pom文件):

2.1、创建模拟转账的功能接口

2.2、实现2.1的接口方法

3、创建Spring配置文件(基于Java的文件)

4、创建主程序对代码进行测试。

5.1、附1:数据库表结构

5.2、附2:源代码地址:


1、依赖引入(pom文件):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>xyz.jangle</groupId>
  <artifactId>spring</artifactId>
  <version>0.0.1-SNAPSHOT</version>


<properties>
	<spring.version>5.2.2.RELEASE</spring.version><!-- 声明spring版本号 -->
</properties>
<dependencies>

		<!-- 0.引入JDBC -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- 1.Spring核心依赖 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		
		<!-- mysql驱动 -->
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>5.1.31</version>
		</dependency>
		
</dependencies>

<build>
		<pluginManagement>
			<plugins>
                <!-- 设置MAVEN的编译的JDK版本为1.8 -->
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>2.3.2</version>
					<configuration>
						<source>1.8</source>
						<target>1.8</target>
						<encoding>UTF-8</encoding>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>

2.1、创建模拟转账的功能接口

package spring.m6_3.service;
/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2022年10月8日 上午9:30:53
 * 
 */
public interface AccountService {
	
	/**
	 * 转账
	 * @author jangle
	 * @time 2022年10月8日 上午10:04:48
	 * @param sourceId
	 * @param targetId
	 * @param amount
	 */
	void transferMoney(long sourceId, long targetId, double amount);

}

2.2、实现2.1的接口方法

package spring.m6_3.service.impl;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.transaction.annotation.Transactional;

import spring.m6_3.service.AccountService;

/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2022年10月8日 上午9:36:41
 * 
 */
public class AccountServiceJdbcTxImplWithSpring implements AccountService{
	
	private DataSource dataSource;

	@Override
	@Transactional
	public void transferMoney(long sourceId,long targetId,double amount) {
		// 必须使用DataSourceUtils来获取连接,否则无法使用事务功能。
		Connection connection = DataSourceUtils.getConnection(dataSource);
		try {
			//如果使用普通的连接,那么转账后异常时,转账依旧生效(不会回滚)
//			Connection connection = dataSource.getConnection(); 
			Statement statement = connection.createStatement();
			statement.executeUpdate("update table_a set balance = balance - "+amount+" where "
					+ "id = "+ sourceId);
			statement.executeUpdate("update table_a set balance = balance + "+amount+" where "
					+ "id = "+ targetId);
//			throw new RuntimeException(); // 如果在此处添加异常,则上面的SQL转账功能将会不生效(会回滚)。
		} catch (SQLException e) {
			throw new RuntimeException();
		} finally {
			DataSourceUtils.releaseConnection(connection, dataSource);
		}
	}


	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}




}

3、创建Spring配置文件(基于Java的文件)

package spring.m6_3;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import spring.m6_3.service.AccountService;
import spring.m6_3.service.impl.AccountServiceJdbcTxImplWithSpring;

/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2022年10月8日 上午9:53:28
 * 
 */
@Configuration
@EnableTransactionManagement
public class Configuration6_3 {
	/**
	 * 配置数据源
	 * 
	 * @author jangle
	 * @time 2022年10月8日 上午11:13:54
	 * @return
	 */
	@Bean
	public DataSource dataSource() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=UTF8");
		dataSource.setUsername("jangle_demo");
		dataSource.setPassword("1");
		return dataSource;
	}
	
	/**
	 * 	1.必须创建这个事务对象,spring的事务管理功能才可用。
	 *  2.spring通过“类型”自动装配,所以不用担心取名的问题以及配置的问题。
	 * @author jangle
	 * @time 2022年10月8日 上午10:22:18
	 * @return
	 */
	@Bean
	public PlatformTransactionManager transactionManager() {
		DataSourceTransactionManager manager = new DataSourceTransactionManager();
		manager.setDataSource(dataSource());
		return manager;
	}
	
	@Bean
	public AccountService accountService() {
		AccountServiceJdbcTxImplWithSpring bean = new AccountServiceJdbcTxImplWithSpring();
		bean.setDataSource(dataSource());
		return bean;
	}

}

4、创建主程序对代码进行测试。

 package spring.m6_3;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import spring.m6_3.service.AccountService;

/**
 * 
 *  6.3、使用Spring的声明式事务管理(DEMO)。
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2022年10月8日 上午10:08:50
 * 
 */
public class M {

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Configuration6_3.class);
		AccountService accountService = context.getBean(AccountService.class);
		accountService.transferMoney(1L, 2L, 5.0d);
		System.out.println("完成转账。");
	}

}

5.1、附1:数据库表结构

CREATE TABLE `table_a` (
	`id` INT(10) UNSIGNED NOT NULL,
	`name` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
	`age` INT(11) NULL DEFAULT NULL,
	`address` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
	`balance` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`) USING BTREE
)

5.2、附2:源代码地址:

GitHub - bof-jangle/beginningSpring: Spring 入门经典

参考文献:《Spring 入门经典》

spring编程式事务实现 演示了spring编程式事务的实现,通过TransactionTemplate模板进行事务控制 立即下载

相关推荐

基于SpringMVC的编程式事务源代码示例

基于SpringMVC的编程式事务源代码示例,一目了然的超简单使用事务的方式,让你一分钟会用事务。

spring编程式事务入门案例

参考网址:spring事务分为 和 一般我们使用声明式事务 , 通过 @Transational 注解 , spring 就可以帮我们控制事务简单方便声明式事务大概原理Spring 管理的 javabean 上标注 @Transational 注解 , 或者在类的对应方法上标注@Transational注解 ,那么对应类或者对应方法就会被 sprin 事务管理 , 底层 spring 会将该类生成动态代理对象 , 没有出现异常 , 自动提交 , 如果出现异常, 回滚操作 , 用户可以自定义哪些异常进行回滚

java技术博客 373

spring注解事务实现demo

声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。spring注解事务实现demo

手写一个Spring事务管理Demo

什么是Spring事务管理? Spring事务管理,核心思想是帮我们管理数据库链接。 传统的执行sql,都是执行sql会从数据库连接池中开启一个连接。 是对应的一个连接做sql操作。如果涉及多个sql执行,那么一个连接还好管理。 那如果是用mybatis或者hibernate这样的orm框架。我们怎么用一个连接去执行呢? 这时就需要spring了。spring提出了DataTransactionalManager这样的容器,来帮我们处理集成了mybatis,hibernate这样框架后的建立一个连

qq_37074682的博客 348

RTAB-map:实时高效的SLAM库

Real‐time appearance‐based mapping (RTAB‐Map)是一种基于外观的闭环检测方法,具有良好的内存管理,以满足处理大场景和在线长周期管理要求。RTAB‐Map集成了视觉和激光雷达SLAM方案,并支持目前绝大多数的传感器 是一个强大的、开源的Simultaneous Localization and Mapping(SLAM)库,专为机器人和无人驾驶领域设计。它提供了一套完整的解决方案,用于构建三维地图,并在未知环境中进行实时定位与导航。 github项目地址 RTAB-

weixin_45761399的博客 1万+

Qcom camera hal简介

Qcom camera hal简介

weixin_42136255的博客 7760

SpringBoot的注解式事务和编程式事务案例

注解式事务通过@Transactional注解实现,支持多种传播行为,如REQUIRED(默认)、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED、MANDATORY、NEVER和NESTED。编程式事务通过显式调用事务管理 API 来控制事务的边界。开发者需要手动编写代码来开启事务、提交事务或回滚事务。这种方式提供了更高的灵活性,适用于需要精细控制事务行为的复杂场景。

m0_47031476的博客 1276

VCSA 上的 vmware-vpxd 服务失败,Web端提示503 服务不可用 (503 Service Unavailable)

昨晚VCSA碰到一个很诡异的问题: 使用 vSphere Web Client 连接到 vCenter Server Appliance时失败,提示: 503 服务不可用 (503 Service Unavailable) 无法连接端点 (Failed to connect to endpoint):[N7Vmacore4Http20NamedPipeServiceSpecE:0x00007f975808ee30] _serverNamespace = / action = Allow _pipeNam

徐华的博客 2万+

spring事务处理demo

1.事务是什么及为什么使用事务         事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。   例如:     我要修改一个旅游产品,首先是根据productId查出对应的团队游产品,然后根据productId查询出对应的行程信息表并进行修改,保存;然后再根据p...

u011975348的专栏 305

YOLOv11改进策略【卷积层】| CVPR 2024 可变形卷积 v4(DCNv4)无界权重提表达 + 线程合并降冗余,强化模型收敛速度

DCNv4(Deformable Convolution v4)是一种专为广泛视觉应用设计的高效算子,它对DCNv3进行了关键改进,有效解决了DCNv3存在的速度慢和表达能力受限等问题。

Limiiiing的博客 925

YOLOv12改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是基于StarNet的YOLOv12轻量化改进方法研究。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 1215

Spring手动编写事务DEMO

【代码】Spring手动编写事务DEMO。

博风_刺耳的博客(网络记事本) 184

《UDS协议从入门到精通》系列——图解0x14:清除诊断信息

图解0x14:清除诊断信息,简洁易懂,迅速上手!

车载系统攻城狮 4818

Spring编程式事务管理和声明式事务管理 案例

转账案例使用了Spring事务管理,用两种方式实现:编程式事务管理和声明式事物管理。    其中,编程式事务管理是一种手动修改代码的方式,比较麻烦,在开发过程中很少使用;声明式事务管理有三种方法实现,分别是TransactionProxyFactoryBean的代理方式、基于AspectJ的xml配置方式和基于注解的声明方式,后两种在开发应用中常常出现。

此处省略三千字 3407

带洞多边形如何分成凸多边形集合,对多边形进行凸分解?

摘要: 凸分解是计算几何中的经典问题,分为三角化和凸分解两种方法。三角化将带洞多边形转换为简单多边形并分割为三角形,常用算法包括耳剪法、单调多边形三角化等。凸分解则生成更少但更大的凸多边形,常用Hertel-Mehlhorn算法或基于凹点的递归切割。实际应用中建议使用CGAL、Poly2Tri等成熟库处理。三角化适合图形渲染,凸分解更适用于物理引擎和路径规划。关键步骤包括数据校验、选择合适的算法及后处理优化。

插件开发 353

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring使用篇(十一)—— Spring与MyBatis事务管理

文章目录1、配置Spring数据库事务2、数据库隔离级别与传播行为3、声明式事务4、在Spring+MyBatis组合中使用事务 1、配置Spring数据库事务 2、数据库隔离级别与传播行为 3、声明式事务 4、在Spring+MyBatis组合中使用事务 ...

王喆峰的博客 8705

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring的两种事务管理机制,面试这样答当场入职!

博主在最近的几次面试中,大中小厂都问到了Spring的事务相关问题,这块知识确实是面试中的重点内容,因此结合所看的书籍,在这篇文章中总结下。如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~以下正文开始。

小威的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

第一个spring声明式事务管理的例子

在applicationContext.xml中需要有一些基本配置                                                                                                                              

wei--heizhi的专栏 2360

Spring 声明式事务管理 以及 事务中的异常捕获

Spring 的声明式事务管理是通过AOP 技术实现的事务管理,其本质是对目标方法进行前后拦截,然后在目标方法执行之前创建或者加入一个事务,在目标方法执行完成后根据目标方法的执行情况进行事务提交或者回滚。 声明式事务的最大优点是不需要通过编程式对事务进行管理,即不需要在业务代码中掺和大量事务处理的代码,保证了代码的简洁性,便于后期的维护。 Spring 的声明式事务管理有两种方式 :基于 XML的...

qq_41193133的博客 1044

Spring中的事务管理

Spring中的事务管理,①基于xml配置文件和注解的混合方式,②基于完全xml配置文件的方式,③基于完全注解的方式。

qq_40834643的博客 2542

Spring项目配置事务管理——使用注解实现声明式事务

一般来说声明式事务使用的较多,很方便。一个事务处理的操作单元往往是对应着一系列到数据库操作。直白的说就是service层里的一个方法里包含着多个CRUD(增删改查)。Spring提供事务管理的机制,但是具体底层的实现是交由数据库(innodb支持ACID特性,交由数据库日志实现,而MyISAM则不支持ACID)或者持久化的平台(mybatis,Hibernate)。

qq_38261445的博客 475

Spring事务管理3-声明式事务管理

============ TransactionProxyFactoryBean方式 package cn.muke.spring.demo2; /** * 转账案例的DAO层的接口 */ public interface AccountDao { /** ...

chihanjue1993的博客 128

【Spring】Spring事务管理

介绍什么是事务,事务隔离级别,spring事务的实现,两种实现方式介绍,spring隔离级别、传播机制

zhyhgx的博客 1653

1.5 Spring框架 --基于AOP的声明式事务管理

Spring中,名为spring-tx-4.3.6.RELEASE的jar包,是Spring用于事务管理的依赖包,使用前需要在pom.xml中添加到依赖标签中: Spring中事务管理实现分为 编程式事务管理 和 声明式事务管理两种, 前者是传统的方式,在业务逻辑中调用事务管理方法; 后者是借助于AOP技术实现的,将事务管理作为一个切面,在适当的切入点进行事务的提交、回滚、获取事务状态、获取事务...

weixin_43835284的博客 269

Spring中使用声明式事务管理

声明: 有一些博文是看的黑马程序员视频,然后跟着老师做的笔记 Spring是跟子路老师学的 特此感谢,写这些文章的目的是为了自己方便查阅

JDS_DIJ的博客 160
上一篇: mybatis DEMO
下一篇: 4.3.4、在jdbcTemplate中使用prepareStatement
博风
博客等级 码龄16年 442粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值