在数据库系列文章中[MySQL数据库事务基本操作](http://blog.csdn.net/fengpojian/article/details/73571983)
介绍了MySQL数据库基本的事务操作。这篇文章将介绍一个实例来更好的理解学习MySQL数据库事务。
这个Demo主要是模拟银行转账的过程,两个账户发生转账关系时,首先改变双方账户的余额状态。
随后验证转出方账户是否有足够的余额来支撑此次的转账操作,若余额不足,则抛出“账户余额不足”异常。
请注意,这个Demo只适用于单线程的情况。
java
/*** 单线程下的数据库事务* 模拟银行转账* @author LinGer**/
public class Transaction
{public boolean transfrom(int fromId, int toId, double amount){Connection con = MyUtil.getCon();String sql1 = "update tb_account set balance = balance - ? where userId = ?;";String sql2 = "update tb_account set balance = balance + ? where userId = ?;";String sql3 = "select balance  from tb_account where userId = ?;";PreparedStatement ps1 = null;PreparedStatement ps2 = null;PreparedStatement ps3 = null;ResultSet rs = null;try{//开启事务con.setAutoCommit(false);//转账时涉及的两个账户以及各账户的金额变动ps1 = con.prepareStatement(sql1);ps1.setDouble(1, amount);ps1.setInt(2, fromId);ps1.executeUpdate();ps2 = con.prepareStatement(sql2);ps2.setDouble(1, amount);ps2.setInt(2, toId);ps2.executeUpdate();//检查转出方账户的余额是否足够支持此次转账金额;如果余额不足,则抛出“余额不足”异常,并回滚ps3 = con.prepareStatement(sql3);ps3.setInt(1, fromId);rs = ps3.executeQuery();Double balance = 0.0;if(rs.next()){balance = rs.getDouble("balance");}if(balance < 0){throw new Exception("账户余额不足");}con.commit();return true;} catch (Exception e){e.printStackTrace();}try{con.rollback();} catch (SQLException e){e.printStackTrace();}finally{try{rs.close();ps1.close();ps2.close();ps3.close();con.close();} catch (SQLException e){e.printStackTrace();}}return false;}
}
java
/*** 工具类 获得Connection连接* @return*/
public static Connection getCon(){String DBDriver = "com.mysql.jdbc.Driver";String DBUrl = "jdbc:mysql://localhost:3306/study?autoReconnect=true&"+ "failOverReadOnly=false&useUnicode=true&characterEncoding=UTF-8";String name = "root";String pass = "123";Connection con = null;try {Class.forName(DBDriver);con = DriverManager.getConnection(DBUrl,name,pass);} catch (Exception e) {e.printStackTrace();}return con;}
java
/*** 实体类 模拟银行账户* @author LinGer**/
public class User
{private int userId;private String userName;private Double balance; //账户余额//get && setpublic int getUserId(){return userId;}public void setUserId(int userId){this.userId = userId;}public String getUserName(){return userName;}public void setUserName(String userName){this.userName = userName;}public Double getBalance(){return balance;}public void setBalance(Double balance){this.balance = balance;}
}
这篇博客的代码参考了https://www.oschina.net/code/snippet_2271303_44733#62843
非常感谢博主。

MySQL数据库事务实例(模拟银行转账)相关推荐

  1. 使用Mysql执行事务实现模拟银行转账功能

    MySQL二十三:执行事务实现转账 -- 事务 -- 测试实现转账 -- 注意点:mysql 是默认开启事务自动提交的 SET autocommit = 0 -- 关闭事务自动提交 SET autoc ...

  2. MySQL数据库事务、mybatis框架、spring框架、springmvc框架、永和大王门店管理系统(框架第二部分)

    第十二章 MySQL数据库事务 一. 事务及四大特性 1.什么是事务 数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行 ...

  3. MYSQL数据库周德伟教程后题_《MySQL数据库基础实例教程》编者:周德伟,覃国蓉著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 编者:周德伟,覃国蓉著 出版社:人民邮电出版社 出版时间:2017-08-01 版次:1 开本:16开 装帧:平装 ISBN:9787115461872 版权提供:人民邮电出版社 基 ...

  4. python爬取mysql数据_Python爬取数据并写入MySQL数据库的实例

    Python爬取数据并写入MySQL数据库的实例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python爬取数据并写入MySQL数据库的实例.txt ] (友 ...

  5. php mysql数据库同步_实现MySQL数据库同步实例演示_MySQL

    本次实验的主要目的是剖析配置MySQL(和PHP搭配之最佳组合) 数据库的主辅MySQL数据库同步的实际操作步骤,我前两天在相关网站看见的资料,觉得挺好,就拿出来供大家分享,开始具体的配置. 本次试验 ...

  6. MySQL学习-MySQL数据库事务

    MySQL数据库事务 1.事务概述 1.什么是事务? 2.和事务相关的语句只有:**DML语句.(insert delete update)** 3.假设所有的业务都能使用1条DML语句搞定,还需要事 ...

  7. python爬取新闻存入数据库_Python爬取数据并写入MySQL数据库的实例

    按 F12 或 ctrl+u 审查元素,结果如下: 结构很清晰简单,我们就是要爬 tr 标签里面的 style 和 tr 下几个并列的 td 标签,下面是爬取的代码: #!/usr/bin/env p ...

  8. java读写mysql数据库_Java读写MySQL数据库小实例

     Java读写MySQL数据库小实例 首先需要安装和配置好MySQL数据库.接下来,先创建一个数据库,Java代码连接此数据库,然后读写. 假设基于MySQL命令行创建一个叫做:phildatab ...

  9. 概述MySQL数据库---事务隔离级别

    同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题,事务并发处理可能引起的问题可分为如下三种类型: 脏读(Drity Read): 已知有两个事 ...

  10. mysql数据库事务隔离级别演示

    mysql数据库事务隔离级别演示 关键词: 一.基本概念 二.事务的四个特性(ACID) 三.事务的用法 3.1 相关命令 3.2 使用步骤 四.数据库的隔离级别 五.示例演示(每组事务结束手动com ...

最新文章

  1. python3 sha 系列 hex 加密 以sha256为例
  2. java学习笔记11--集合总结
  3. 斐波那契数列算法分析
  4. CS224n —— lecture2的重难点讲解
  5. 中国电信叫停不限量套餐 套外资费3元/GB
  6. 洛谷——P1304 哥德巴赫猜想
  7. 线性表建立学生信息表
  8. Camera_Hal3_User_Manual
  9. ZedGraph的一些属性
  10. sim800使用方法
  11. 【工程/物理光学(一)——光的电磁理论基础】
  12. matlab将矩阵分解成lu,MATLAB中矩阵LU分解
  13. 2020年下半期第一次实训
  14. git rebase详解(图解+最简单示例,一次就懂)
  15. [组原]初识-地址总线,地址寄存器,存储单元,存储字长
  16. 使用lanyu的激活码,报错1653219,解决办法
  17. mac忘了密码怎么办_如果忘记Mac密码该怎么办
  18. 文本预处理学习(2)
  19. 数据挖掘算法原理与实践:数据预处理
  20. 【activityMQ】一头扎进activeMQ学习

热门文章

  1. 计算机游戏优化,Win10电脑玩游戏优化方法!必须关闭这几个设置,效果提升巨大...
  2. 软件架构师-Scrum敏捷开发-MVC模型-燃尽图
  3. Windwos tar 命令详解
  4. arcgis for android 调用公网天地图注记重影问题
  5. Laravel 数据库迁移
  6. 谭浩强第五版课后习题答案-----第三章
  7. matlab将矩阵分解成lu,MATLAB中矩阵LU分解
  8. 【运筹学】整数规划、分支定界法总结 ( 整数规划 | 分支定界法 | 整数规划问题 | 松弛问题 | 分支定界法 | 分支定界法概念 | 分支定界法步骤 ) ★★
  9. Pano2VR 6 for Mac中文破解版永久激活方法附授权密钥
  10. 控制算法简析3——LKA中PID控制的error选取