一、建立余额表(bal_tab,余额必须大于0)、交易表(bus_tab)

二、建立转账事务类BankBusiness.java

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;import cn.yanchengdai.util.DataSourceForPool;/*** 银行转账事务处理示例* @author Administrator**/
public class BankBusiness {/*** 处理转账的方法* @param transferMoney*/public void testTrans(int transferMoney) {/*从数据库连接池中获取数据库连接*/Connection conn = DataSourceForPool.getConnection();/*交易表中插入两条数据*/String sql1 = "insert into bus_tab values(?,?,?,?,?)";String sql2 = "insert into bus_tab values(?,?,?,?,?)";/*余额表中更新余额*/String sql3 = "update bal_tab set balance=(balance-?) where id = ?";String sql4 = "update bal_tab set balance=(balance+?) where id = ?";/*声明PreparedStatement变量*/PreparedStatement ps1 = null;PreparedStatement ps2 = null;PreparedStatement ps3 = null;PreparedStatement ps4 = null;try {/*设置自动关闭connetion自动提交*/conn.setAutoCommit(false);ps1 = conn.prepareStatement(sql1);ps1.setInt(1, 1);ps1.setInt(2, transferMoney);ps1.setString(3, "转出");ps1.setDate(4, new java.sql.Date(System.currentTimeMillis()));ps1.setInt(5, 100);ps2 = conn.prepareStatement(sql2);ps2.setInt(1, 2);ps2.setInt(2, transferMoney);ps2.setString(3, "转入");ps2.setDate(4, new java.sql.Date(System.currentTimeMillis()));ps2.setInt(5, 200);ps3 = conn.prepareStatement(sql3);ps3.setInt(1, transferMoney);ps3.setInt(2, 100);ps4 = conn.prepareStatement(sql4);ps4.setInt(1, transferMoney);ps4.setInt(2, 200);ps1.executeUpdate();ps2.executeUpdate();ps3.executeUpdate();ps4.executeUpdate();/*以上顺利执行,则提交事务*/conn.commit();System.out.println("转账成功");} catch (SQLException e) {System.out.println("转账失败,事务回滚!");try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally {try {ps4.close();ps3.close();ps2.close();ps1.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

三、测试类TestTransaction.java

import java.util.Scanner;import cn.yanchengdai.dao.BankBusiness;public class TestTransaction {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.println("请输入转账金额:");int transfer = in.nextInt();System.out.println("银行正在转账中,请稍后。。。");new BankBusiness().testTrans(transfer);}}

四、测试结果

当转账20000时,余额=0,违反了检查约束,事务回滚,两张表中数据不变:

当转账9000时,显示转账成功。

转账记录:

余额表:

jdbc处理银行转账事务相关推荐

  1. JDBC的入门案列以及JDBC的对事务的管理

    JDBC的概念 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中 ...

  2. Spring——DAO层、Spring JDBC、Spring事务控制

    目录 一.Spring对持久层技术支持 1.Spring支持的持久层技术 2.Spring JDBC 2.1. JDBCTemplate类 2.2.Spring JDBC CRUD操作 2.3.Spr ...

  3. java jdbc 回滚_java_详解Java的JDBC API中事务的提交和回滚,如果JDBC连接是在自动提交模式 - phpStudy...

    详解Java的JDBC API中事务的提交和回滚 如果JDBC连接是在自动提交模式下,它在默认情况下,那么每个SQL语句都是在其完成时提交到数据库. 这可能是对简单的应用程序,但有三个原因,你可能想关 ...

  4. JDBC和数据库事务详解

    现在还在写 JDBC 事务的文章,我觉得我一定是相当的 Out 了,现在主流的 java 应用,框架都是分布式的,各种分布式的事务,或者容器事务才是需要学习的重点,在这里谈 JDBC 确实有点不合时宜 ...

  5. Spring JDBC声明式事务管理

    Java事务的类型有三种: (1)JDBC事务:可以将多个 SQL 语句结合到一个事务中.JDBC 事务的一个缺点是事务的范围局限于一个数据库连接.一个 JDBC 事务不能跨越多个数据库. (2)JT ...

  6. JDBC学习总结(二)JDBC操作Blob类型字段高效的批量插入JDBC处理数据库事务将多个SQL看成一个事务执行数据库连接池C3P0DBCPDruidDBUtils工具类实现CRUD

    JDBC学习总结(二)JDBC操作Blob类型字段/高效的批量插入/JDBC处理数据库事务/将多个SQL看成一个事务执行/数据库连接池C3P0/DBCP/Druid/DBUtils工具类实现CRUD ...

  7. 【Spring】通过动态代理改进银行转账事务控制

    前情 银行转账的案例中,通过给业务层实现类中每个方法中通过事务控制方法添加事务控制,保证每个方法在执行时只有一个数据库连接,通过事务保证整个方法要成功全部成功,要失败都失败. 问题 业务层实现类添加事 ...

  8. JDBC(数据库连接、事务)

    学习目标 能够理解JDBC的概念(很重要) 能够使用DriverManager类(掌握) 能够使用Connection接口(掌握) 能够使用Statement接口(掌握) 能够使用ResultSet接 ...

  9. JDBC学习笔记——事务、存储过程以及批量处理

    2019独角兽企业重金招聘Python工程师标准>>> 1.事务                                                           ...

  10. JDBC中开启事务的批量插入操作

    直接上代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public cl ...

最新文章

  1. iOS10 UI教程层次结构的事件
  2. LeetCode刷题:滑动窗口模板以及典型例题
  3. springboot 项目部署为war项目
  4. android自动让输入框上划,Android界面技巧:当输入法调出时,如何让界面自动上移,使输入法不会遮挡到主界面(Activity)...
  5. lastindexof方法_Java Vector lastIndexOf()方法与示例
  6. 时间格式化,常用时间,格式
  7. php模板中的数组在哪,php – Twig:从包含的模板中添加项目到数组
  8. 计算机组成第五章课后答案,计算机组成原理第五章答案.doc
  9. keil_lic.exe注册机使用
  10. android手机网络Ping测试
  11. 博饼程序-Java实验
  12. uniapp 前端获取历史搜索记录
  13. 开启Windows远程桌面
  14. 电平触发和边沿触发——数电第五章学习
  15. UML在md中的写法与示意
  16. Revit建模弹窗警告:图元稍微偏离了轴,可能会导致不精确
  17. Magnetic Actuation Systems for Miniature Robots: A Review
  18. opencv图像处理-常见绘图函数
  19. Java中的Spec
  20. 【QT实现TCP和UDP协议通信(二)】

热门文章

  1. 热血江湖游戏窗口化的方法
  2. 小米 MIUI 主题制作
  3. linux下音频剪辑软件,音频剪辑软件哪个好用?5款免费开源的音频剪辑软件推荐...
  4. java 开源客服系统_一个开源的智能客服系统
  5. stm32以中断方式扫描矩阵键盘
  6. 如何将PNG图像转换为word文档?
  7. 微pe工具箱 系统安装教程_微pe工具箱怎么安装win10系统?微pe工具箱安装win10系统详细教程...
  8. 21天学通c语言错误,为《21天学通C语言》(第7版)(Sams Teach Yourself C in 21 Days)正名...
  9. 十字链表表示矩阵c语言,十字链表法,十字链表压缩存储稀疏矩阵详解
  10. 9款最新炫酷HTML5/CSS3应用推荐