Spring中使用事务搭建转账环境 转账操作一个账户要减少资金操作一个账户要增加资金操作,如果在两个操作间出现异常转账失败 所以要使用事务

本文主要是介绍Spring中使用事务搭建转账环境 转账操作一个账户要减少资金操作一个账户要增加资金操作,如果在两个操作间出现异常转账失败 所以要使用事务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

演示不使用事务出现异常情况

Dao层两个方法lessMoney()和moreMoney()

package com.swift;import org.springframework.jdbc.core.JdbcTemplate;public class AccountDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}//少钱的方法public void lessMoney(String from,double number) {String sql="update account set money=money-? where username=?";jdbcTemplate.update(sql, number,from);}//多钱的方法public void moreMoney(String to,double number) {String sql="update account set money=money+? where username=?";jdbcTemplate.update(sql, number,to);}
}

Service层调用两个方法

package com.swift;public class AccountService {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}public void moneyTransfer(String from,String to,double number) {accountDao.lessMoney(from,number);int i=10/0;accountDao.moreMoney(to,number);}
}

但是两个操作减与加之间,如果出现异常,则会导致转账钱已经转了,但对方却没有到账的bug,可能服务器突然故障等引起


 

解决添加事务,出现异常进行回滚操作

下面使用配置文件的方法进行事务管理

没有改变的测试类

package com.swift;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;@WebServlet("/test")
public class ServletTest extends HttpServlet {private static final long serialVersionUID = 1L;public ServletTest() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");response.getWriter().append("Served at: ").append(request.getContextPath());//使用JdbcTemplat的queryForObject方法ApplicationContext context=new ClassPathXmlApplicationContext("c3p0.xml");AccountService accountService= (AccountService) context.getBean("accountService");accountService.moneyTransfer("佣兵组织", "高扬", 100000);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

使用配置文件进行事务处理步骤如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- c3p0连接池得到dataSource --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sw_database"></property><property name="user" value="root"></property><property name="password" value="root"></property></bean><!-- 第一步 配置事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 注入dataSource --><property name="dataSource" ref="dataSource"></property></bean><!-- 第二步 配置事务增强 --><tx:advice id="txadvice" transaction-manager="transactionManager"><!-- 做事务操作 --><tx:attributes><!-- 事务操作的方法匹配规则 --><tx:method name="money*" propagation="REQUIRED"/></tx:attributes></tx:advice><!-- 第三步 配置切面 --><aop:config><!-- 切入点 --><aop:pointcut expression="execution(* com.swift.AccountService.*(..))" id="pointcut1"/><!-- 切面 --><aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/></aop:config><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><bean id="accountDao" class="com.swift.AccountDao"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean><bean id="accountService" class="com.swift.AccountService"><property name="accountDao" ref="accountDao"></property></bean></beans>

分三个步骤 管理 增强和切面

虽然还是会有异常,但是数据库中不会出错,不会钱转出了,却没有到账

工具类Account

package com.swift;public class Account {private int id;private String username;private String money;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getMoney() {return money;}public void setMoney(String money) {this.money = money;}public Account(int id, String username, String money) {this.id = id;this.username = username;this.money = money;}public Account() {super();// TODO Auto-generated constructor stub
    }@Overridepublic String toString() {return "Account [id=" + id + ", username=" + username + ", money=" + money + "]";}}

 

这篇关于Spring中使用事务搭建转账环境 转账操作一个账户要减少资金操作一个账户要增加资金操作,如果在两个操作间出现异常转账失败 所以要使用事务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762193

相关文章

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言