使用事务实现银行转账操作

实践项目七:模拟银行转账系统(python+mysql) 最近学习python操作mysql数据库的知识,python访问数据库有自己的统一接口程:Python DB API。这是那我学习的一个小例子。 首先要知道使用Python DB API 访问数据库的流程: 开始—->创建connection—->获取cursor—->执行查询, 执行命令, 获取数据, 处理数据—->关闭cursor —->关闭connection—->结束。 模拟银行转账系 阅读详情

建表:

CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30),
money FLOAT
);


INSERT INTO account(username,money) VALUES('wency',1000),
('tom',1000),
('mary',1000);


使用到的jar包有:

c3p0-0.9.1.2.jar

commons-dbutils-1.4.jar

mysql-connector-java-5.0.8-bin.jar


c3po工具类

package com.wency.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mysql.jdbc.ResultSet;

public class C3p0Utils {
	//创建ComboPooledDataSource对象
		private static DataSource dataSource=new ComboPooledDataSource();
		//获取连接的方法
		public static Connection getConnection(){
			try {
				return dataSource.getConnection();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				throw new RuntimeException("服务器出错");
			}
		}
		//获取数据源
		public  static DataSource getDataSource() {
			return dataSource;
		}
		//释放资源
		public static void release(Connection conn,PreparedStatement prsmt,ResultSet rs){
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				conn=null;
			}
			
			if(prsmt!=null){
				try {
					prsmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				prsmt=null;
			}
			
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				rs=null;
			}
			
		}
}

ThreadLocalUtil类

package com.wency.utils;

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

public class ThreadLocalUtil {
	private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();
	
	/**
	 * 
	 * @return 从线程池中获取一个连接
	 */
	public static Connection getConnection(){
		Connection conn=tl.get();//从线程中获取连接
		//如果conn为空,则从线程池中取出 一个,如果不为空则直接返回原来那个
		//这样做的目的是为了确保事务操作时线程不被其他线程干扰
		if(conn==null){
			conn=C3p0Utils.getConnection();
			tl.set(conn);//将连接放到tl中去
		}
			return conn;
	}
	
	/**
	 * 开启事务
	 */
	public static void startTranscation(){
	    try {
			getConnection().setAutoCommit(false);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 提交事务
	 */
	public static void commit(){
		try {
			getConnection().commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 回滚事务
	 */
	public static void rollback(){
		try {
			getConnection().rollback();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 释放资源
	 */
	public static void release(){
		try {
			getConnection().close();
			tl.remove();//关闭连接之后要将该线程移除
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
Account实体类

package com.wency.entity;

public class Account {
	private int id;
	private String username;
	float 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 float getMoney() {
		return money;
	}
	public void setMoney(float money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "Account [id=" + id + ", username=" + username + ", money="
				+ money + "]";
	}
	
}

Dao接口

package com.wency.dao;


import com.wency.entity.Account;

public interface Dao {
	//修改账户操作
	 int updateAccount(String username,float money);
	//根据姓名查找账户
	 Account findAccountByName(String name);
}


Dao实现类

package com.wency.dao.impl;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;



import com.wency.dao.Dao;
import com.wency.entity.Account;
import com.wency.utils.C3p0Utils;

public class DaoImpl implements Dao {
	
	private final String UPDATE="update account set money=? where username=?";
	private final String SELECT="select * from account where username=";
	
	 public DaoImpl() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public  Account findAccountByName(String name) {
		// TODO Auto-generated method stub
		QueryRunner qr=new QueryRunner(C3p0Utils.getDataSource());
		List<Account> list=null;
		try {
			list = qr.query(SELECT+"'"+name+"'",new BeanListHandler<Account>(Account.class));
			return list.get(0);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
		
		}
		return null;
		
	}

	@Override
	public  int updateAccount(String username, float money) {
		// TODO Auto-generated method stub
		QueryRunner qr=new QueryRunner(C3p0Utils.getDataSource());
		try {
			int update = qr.update(UPDATE ,money,username);
			return update;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException("数据库操作异常");
		}
	}
}


Service接口
package com.wency.service;



public interface Service {
	void translate(float money,String fromName,String toName);
}
Service实现类
package com.wency.service.impl;

import com.wency.dao.Dao;
import com.wency.dao.impl.DaoImpl;
import com.wency.entity.Account;
import com.wency.service.Service;
import com.wency.utils.ThreadLocalUtil;

public class ServiceImpl implements Service {

	public void translate(float money, String username) {
		// TODO Auto-generated method stub
		
	}
	

	@Override
	public void translate(float money, String fromName, String toName) {
		// TODO Auto-generated method stub
		
		Dao dao=new DaoImpl();

		Account fromAccount=dao.findAccountByName(fromName);
		Account toAccount=dao.findAccountByName(toName);
		try {
			//开启事务
			ThreadLocalUtil.startTranscation();
			dao.updateAccount(fromName, fromAccount.getMoney()-money);
			dao.updateAccount(toName, toAccount.getMoney()+money);
			//提交事务
			ThreadLocalUtil.commit();
		} catch (Exception e) {
			// TODO: handle exception
			//如果出现异常,则回滚
			ThreadLocalUtil.rollback();
			throw new RuntimeException("操作失败");
		}finally{
			//最后将连接关闭
			ThreadLocalUtil.release();
		}
		
	
	}
	

}


测试类
import org.junit.Test;

import com.wency.dao.Dao;
import com.wency.dao.impl.DaoImpl;
import com.wency.entity.Account;
import com.wency.service.Service;
import com.wency.service.impl.ServiceImpl;


public class TestTranslate {
	@Test
	public void testTranslate(){
		Service service=new ServiceImpl();
		service.translate(500, "wency", "tom");
	}
	
	@Test
	public void testUpdate(){
		Dao dao=new DaoImpl();
		int updateAccount = dao.updateAccount("wency", 2000);
		System.out.println(updateAccount);
	}
	@Test
	public void testSelect(){
		Dao dao=new DaoImpl();
		Account account = dao.findAccountByName("wency");
		System.out.println(account);
		
	}
}



SiamFC++笔记 SiamFC++: Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines 文章根据这些思路:引入分类和目标状态估计分支(G1),无歧义的分类得分(G2),无先验知识的跟踪(G3)和评估质量得分(G4)来设计SiamFC ++。 SiamRPN ++和SiamFC ++的比较(红色部分代表得分高的区域): guide: G1 : 分类和状态估计任务的分离:分类任务将目标从干扰物和背景中分类出来,目标状态 阅读详情

相关推荐

Ubuntu下安装Hive3.1.2教程(附MySQL安装方法及安装包)

文章目录前言一、安装Hive1. 下载压缩包并解压2. 安装Hive3. 配置环境变量4. 修改配置文件二、MySQL安装与配置1. 安装MySQL2. 安装MySQL jdbc包3. 为Hive创建MySQL账号三、验证Hive安装及错误处理1. 启动Hadoop2. 启动hive3. 运行Hive实例总结 前言 Hive 的安装需要建立在 Hadoop 的之上(类似于Hbase),关于 Hadoop 的单机安装以及伪分布式安装可以参考作者的另两篇博客: Ubuntu下单机安装Hadoop详细教程(附

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 1万+

Spring学习(四):事务的学习之银行转账案例

Spring 银行转账1.编写一个TransationManager类2.编写一个ConnectionUtils类3.在AccountServiceImpl写业务层代码4.在AccountDaoImpl写实现类代码5.完成注解的注入6.测试 考察点:spring、事务 实现流程 1.编写一个TransationManager类 作用:提供一个事务管理相关的工具类,它包括了,开启事务,提交事务,回滚...

qq_40205337的博客 529

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 940

《数据库原理》实验报告DB7——事务与并发控制

一. 实验内容、步骤以及结果 假设学校允许学生将银行卡和校园卡进行绑定,在student数据库中有如下的基本表,其中校园卡编号cardid即为学生的学号: icbc_card(studcardid, icbcid, balance) //校园卡ID,工行卡ID,银行卡余额 campus_card(studcardid, balance) //校园卡ID,校园卡余额 本实验中的部分示例数据 create table icbc_card( icbcid int, sno varchar(8), bala

CityBoySHU的博客 4998

别再手动配电脑了!手把手教你用Windows Server 2022搭建企业AD域(附DNS配置避坑指南)

本文详细介绍了如何使用Windows Server 2022搭建企业AD域,提升20+终端的管理效率。通过实战案例和避坑指南,解析AD域的核心价值、部署步骤及DNS配置技巧,帮助企业实现集中权限管理、安全策略统一部署,显著降低IT运维成本。

weixin_30652897的博客 349

基于阿里云物联网平台设计的实时图传系统_采用MQTT协议传输图像

当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。 在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,设备B负责接收设备A上传的数据然后解析显示出来。在阿里云服务器上需要配置云产品流转,让设备A的数据上传后自动发送给设备B。这样就完成了视频画面数据的流转。不过因为阿里云的最大数据限制,每次最大发送10240字节的数据。

1万+

事务(转账实例)

事务(以转账为例) 事务:   就是一件完整的事情,包含多个操作单元,这些操作要么全部成功,要么全部失败.   例如:转账,包含转出操作和转入操作. mysql中的事务: mysql中事务默认是自动提交,一条sql语句就是一个事务. 开启手动事务方式 方式1:关闭自动事务.(了解) ...

bangluoo351772的博客 480

SAP会计凭证导入ABAP开发模板+注意点—附带源码

开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。

小九啥也不会 1232

转帐事务及SQL范例编程

转账事务 先建立数据环境(帐户表) 1.转账事务(使用在存储过程中) if exists(select name from sysobjects where name = 'zhuanzhang' and type='p') drop procedure zhuanzhang go --建立一个带有参数的转账存储过程 -- ...

weixin_30333885的博客 383

《YOLOv8:从入门到实战》报错解决 & 专栏答疑

《YOLOv8:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专栏答疑,针对同学们在学习过程中所提出的问题进行汇总记录,并不断实时更新,希望能够帮助到大家!🌈

小哥谈 1241

基于Python的Steam游戏评论与销量数据爬取及预测分析

随着数字游戏市场的蓬勃发展,Steam作为全球最大的数字游戏分发平台,积累了海量的游戏数据与玩家行为数据。本文旨在通过Python网络爬虫技术,采集Steam平台的游戏基本信息、玩家评论数据及销量相关信息,为后续的游戏评论情感分析与销量预测模型构建提供数据支持。本文将详细介绍使用requestsselenium等库实现Steam数据爬取的全过程,并提供完整的代码实现与数据处理方法。关键词:Steam;Python爬虫;数据采集;评论分析;销量预测。

2201_76125261的博客 855

事务实例--银行转账

首先,举个例子:银行(bank)中有两个客户(name)张三和李四我们需要将张三的1000元存款(sal)转到李四的账户上我们需要怎要通过sql语句来实现这个过程update bank set sal = sal - 1000 where name = '张三';update bank set sal = sal + 1000 where name = '李四';但是万一出现一些错误,比如将字段名...

hehanHH的博客 7822

华为OD面试八股真题 - 操作系统相关 - 2

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 967

用SQL server 事务做一个简单的银行转账功能

事务的定义 事务是单个工作单元。 如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分。 如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。 案例分析 需求分析 例如:简单的银行转账 要求假设李四向张三转账200,实现李四的Remain(余额)减少200,张三的Remain(余额)增加200,实现步骤如下: 步骤一:李四Remain字段减少200, 步骤二:张三Remain字段增加200 以上两个步骤都成功,则表示转账成功,任何一个步骤失败则表示转账失败 环

weixin_47217457的博客 3469

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring事务管理+AOP实现银行转账功能

Spring事务管理+AOP实现银行转账功能 使用xml版+注解版(已注掉)配置实现 第一步 建库建表 第二步 创建Dao层接口及其实现类 在Dao层实现两个方法,一个是转出的方法,一个是转入的方法,有个共同点,就是都要知道是谁转的帐(id),转了多少钱(money),在转出的同时,要转入相同的钱数 /**@文件名: BankTransferMoneyDao.java * @类功能说明: 银行转账Dao层接口 * @作者: LiYuHui * @Email: 1327711913@q

weixin_44530087的博客 2617

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java实现转账功能_如何利用Java代码模拟银行转账这一功能?

今天是刘小爱自学Java的第70天。感谢你的观看,谢谢你。话不多说,开始今天的学习:转账,相信基本都接触过,无论是线下用银行卡转账还是线上用手机转账,本质上都是差不多的。一、转账案例需要两个账户:刘小爱账户和刘妈妈账户;刘小爱账户转出;刘妈妈账户转入。刘小爱要给刘妈妈转账,毕竟要攒着将来娶媳妇,emm……就转1000吧(看来是娶不到媳妇了……)在数据库中用sql语句编写一个账户信息表,同时也是对s...

weixin_28727943的博客 3970

事务-转账案例

事务就是多项操作的集合,这多项操作要么都成功,要么都不成功。   转账案例:需求:一个银行用户给另一个银行用户转账,整个过程涉及两个操作,一个是一个用户给另一用户的账户添加100块钱,这个用户的账号上减100块钱,必须出现的情况是:付款者的账户减100块钱,收款者的账户添加100块钱,这两个操作只要有一个没有成功,整个事务就要还原到初始状态,即不能出现一个用户的账号减了100块钱,而收款者的账

您已进入防沉迷系统... 1884

mysql 事务 银行转账_php+mysqli事务控制实现银行转账实例,mysqli银行转账

php+mysqli事务控制实现银行转账实例,mysqli银行转账本文实例讲述了php+mysqli事务控制实现银行转账的方法。分享给大家供大家参考。具体分析如下:事务控制,也就是说所有的语句执行成功后,才会提交。否则,如果前面有语句执行成功,而后面没有执行成功,则回滚到执行之前的状态。通过银行转账的案例来说明这个应用。一个账号转了钱出去,另一个账号必须有钱转入,这样才算成功。代码如下:conne...

weixin_30907685的博客 132

python查询银行汇款_基于Python实现一个简单的银行转账操作

前言在进行一个应用系统的开发过程中,从上到下一般需要四个构件:客户端-业务逻辑层-数据访问层-数据库,其中数据访问层是一个底层、核心的技术。而且在实际开发中,数据库的操作也就是说数据访问层都是嵌套在其他语言中的,其是编程的核心。本文面向的是python语言,即通过python操作数据库来实现简单的银行转账操作。工具python提供了python DB API用来统一操作数据库,使访问数据库的接口规...

weixin_30220707的博客 450

java银行账户模拟_如何利用Java代码模拟银行转账这一功能?

原标题:如何利用Java代码模拟银行转账这一功能?今天是刘小爱自学Java的第70天。感谢你的观看,谢谢你。话不多说,开始今天的学习: 转账,相信基本都接触过,无论是线下用银行卡转账还是线上用手机转账,本质上都是差不多的。一、转账案例需要两个账户:刘小爱账户和刘妈妈账户;刘小爱账户转出;刘妈妈账户转入。刘小爱要给刘妈妈转账,毕竟要攒着将来娶媳妇,emm……就转1000吧(看来是娶不到媳妇了……)在...

weixin_42200829的博客 803

mysql自动转账_php+mysqli事务控制实现银行转账实例

这篇文章主要介绍了php+mysqli事务控制实现银行转账,实例分析了事物控制的原理与事物回滚的使用技巧,需要的朋友可以参考下本文实例讲述了php+mysqli事务控制实现银行转账的方法。分享给大家供大家参考。具体分析如下:事务控制,也就是说所有的语句执行成功后,才会提交。否则,如果前面有语句执行成功,而后面没有执行成功,则回滚到执行之前的状态。通过银行转账的案例来说明这个应用。一个账号转了钱出去...

weixin_29122543的博客 219

学习银行转账系统-代码摘取csdn

变成思想理解 1数据库:2个字段,名字和余额 2.程序设计部分 ,例如A转账20到B账户 ,实现方法A余额-20,B余额增加20即可 代码不是自己缩写,在原有基础上做了修改,并加了具体代码注释 官方代码如下(代码有点小多,不过注释解释的很明白了,不明白可以私信 我,经过调整,运行正常,这次是固定金额的,等下次设置自定义金额,原账户,和目标账户,做一个交互式系统): #银行转账系统,参数,原卡号,新卡号,转账金额 #先建立数据库test_3和表bankdata #加载mysql相关类包mysql

wudongfang666的专栏 1689

mysql 转账语句_php+mysqli事务控制实现银行转账实例_PHP

本文实例讲述了php+mysqli事务控制实现银行转账的方法。分享给大家供大家参考。具体分析如下:事务控制,也就是说所有的语句执行成功后,才会提交。否则,如果前面有语句执行成功,而后面没有执行成功,则回滚到执行之前的状态。通过银行转账的案例来说明这个应用。一个账号转了钱出去,另一个账号必须有钱转入,这样才算成功。代码如下:connect_error){die($mysqli->connect...

weixin_33096511的博客 373

Spring--基于AOP实现事务控制

事务是一组操作组成的单元模块,执行操作时,要么操作成功,要么失败回滚到最开始的状态。本篇文章以银行转账案例为例,实现基于AOP的事务控制。

龙源IT 的博客 2306

模拟银行转账

1 JDBC+MySQL id number pk //用户id ano varchar2(30) uk //用户卡号 apassword varchar2(30) //用户密码 aname varchar2(30) //用户名 amoney number //余额 //创建银行用户表 drop table bank_account; create table

Kirito的博客 2041

Jdbc操作事务(提交、回滚)----以银行转账为例

以银行转账为例----Jdbc操作事务(提交、回滚) private Statement statement; private Connection conn; @Test public void test01() throws Exception { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.g...

Chenlele710147的博客 4297

java 转账_Java总结(随笔)——代码总结JDBC以及事务,以银行转账,查账等为例...

本片文章是对上一篇文章中的事务的例子的功能扩写,用以加深理解,以及代码的熟练度:(1)数据库表数据:(2)引入数据库连接jar包(3)工具类:package org.jdbc.util;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.sql.Connection;im...

weixin_29056101的博客 434
上一篇: DBUtils的使用.
下一篇: 利用Filter实现用户自动登录
codelady
博客等级 码龄11年 26粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值