【JDBC】学习路径7-转账-commit事务操作
现在我们要做一个转账系统。
第一章:创建一张新的表格(用户银行账户表格)
在之前的JDBC_01数据库中新增一个表格,名字为:Account
其中,有id、银行卡号、银行密码、账户余额。
创建表格代码:
create table account (id int not null auto_increment,username varchar(45),password varchar(45),money int,primary key(id));
创建好后,使用命令desc account;
查看表格结构。
接下来,添加两个银行账户,那么就创建小猪和小牛两个人吧。
insert into account(username,password,money) values('小猪','123456',1000);
insert into account(username,password,money) values('小牛','654321',5000);
小猪有1000块钱,小牛有5000
好了,回到IDEA。
第二章:创建基本的转账功能
创建两个执行语句,一个是扣钱,一个是加钱。
public static boolean transform(String name1,String name2,int money){
Connection con = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
ResultSet rs = null;
try {
con = JDBCUtils.getConnection();
String sql = "update account set money = money-? where username = ?";
pstmt1 = con.prepareStatement(sql);
pstmt1.setInt(1, money);
pstmt1.setString(2, name1);
pstmt1.executeUpdate();//返回影响的行数
sql = "update account set money = money+? where username = ?";
pstmt2 = con.prepareStatement(sql);
pstmt2.setInt(1, money);
pstmt2.setString(2, name2);
pstmt2.executeUpdate();//返回影响的行数
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(con, pstmt, rs);
}
return false;
}
转账代码在main中调用:
transform("小猪","小牛",100);
转账前:
转账后:
第三章:为什么要创建事务操作
在转账的过程中,有可能系统会发生错误,断电等等,
这样就有可能导致转钱的人的钱扣了,但是后面的代码就没有执行了,这样收款方就收不到钱了。
比如我们:
空指针错误(随便举的一个例子)
这样就导致小猪少了一百,但是小牛却没有进账。
第四章:使用事务功能Commit
事务操作,简单的说,
就是把一大堆需要一起执行的SQL语句打包好,再一起发送到数据库中。
这样就不会出现上面所说的,
前一条SQL语句发过去数据库了,但因为Java程序死机了,导致后面一个紧跟着的SQL语句没发过去。
使用方法:
在关键的代码(需要一起执行的SQL语句)前添加
con.setAutoCommit(false);
//关键代码,如转账
con.commit();
现在转账代码即:
public static boolean transform(String name1,String name2,int money){
Connection con = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
ResultSet rs = null;
try {
con = JDBCUtils.getConnection();
con.setAutoCommit(false);
String sql = "update account set money = money-? where username = ?";
pstmt1 = con.prepareStatement(sql);
pstmt1.setInt(1, money);
pstmt1.setString(2, name1);
pstmt1.executeUpdate();//返回影响的行数
//上面代码已经扣钱了
//在这里发生了一些意外
String a = null;
a.charAt(2);
//抛出空指针错误
//下面代码就不执行了
sql = "update account set money = money+? where username = ?";
pstmt2 = con.prepareStatement(sql);
pstmt2.setInt(1, money);
pstmt2.setString(2, name2);
pstmt2.executeUpdate();//返回影响的行数
con.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.close(con, pstmt1, rs);
}
return false;
}
我们再执行转账。
即使程序依旧报出空指针错误,但是钱的问题不会发生了。
【JDBC】学习路径7-转账-commit事务操作的更多相关文章
- SSM(spring mvc+spring+mybatis)学习路径——1-2、spring事务管理
目录 1-2 Spring事务管理 概念介绍 事务回顾 事务的API介绍 Spring 事务管理 转账案例 编程式事务管理 声明式事务管理 使用XML配置声明式事务 基于tx/aop 使用注解配置声明 ...
- Java -- JDBC 学习--通过Statement进行数据库更新操作
通过 JDBC 向指定的数据表中插入一条记录. 1. Statement: 用于执行 SQL 语句的对象 1). 通过 Connection 的 createStatement() 方法来获取 2). ...
- 使用JDBC进行数据库的事务操作(2)
本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...
- 使用JDBC进行数据库的事务操作(1)
本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...
- spring学习(三) ———— spring事务操作
前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTem ...
- JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...
- JDBC 学习笔记(二)—— 大数据+存储过程+批处理+事务管理
本文目录: 1.使用JDBC处理大数据 2.使用JDBC处理大文本 3.使用JDBC处理二进制数据 4.Oracle中大数据处理 5 ...
- Java框架spring学习笔记(十七):事务操作
事务操作创建service和dao类,完成注入关系 service层叫业务逻辑层 dao层单纯对数据库操作层,在dao层不添加业务 假设现在有一个转账的需求,狗蛋有10000元,建国有20000元,狗 ...
- Java -- JDBC 学习--事务
数据库事务 在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态.为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个 ...
随机推荐
- 喜提JDK的BUG一枚!多线程的情况下请谨慎使用这个类的stream遍历。
你好呀,我是歪歪. 前段时间在 RocketMQ 的 ISSUE 里面冲浪的时候,看到一个 pr,虽说是在 RocketMQ 的地盘上发现的,但是这个玩意吧,其实和 RocketMQ 没有任何关系. ...
- C#/VB 数据库连接字符串大全
C#/VB 数据库连接字符串大全 https://www.connectionstrings.com/ SQL Server常用 Standard Security Server=myServerAd ...
- 在生产中部署ML前需要了解的事
在生产中部署ML前需要了解的事 译自:What You Should Know before Deploying ML in Production MLOps的必要性 MLOps之所以重要,有几个原因 ...
- 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能
我对几个应用进行严格的启动性能评估,对比了在 .NET Framework 和 dotnet 6 下的应用启动性能,非常符合预期的可以看到,在用户的设备上,经过了 NGen 之后的 .NET Fram ...
- 【RPA之家BluePrism手把手教程】2.3 多重计算
2.3.1 添加除法运算计算框 2.3.2 设置除法运算计算属性 2.3.3 程序运行前初始值 2.3.4 程序运行后结果 使用多重计算框实现以上操作 2.3.5 添加多重选择框 2.3.6 设置多重 ...
- 8.4 苹果macOS电脑如何安装Java开发环境(JDK)
和Windows电脑安装差不多. 下载 来到JDK官方下载界面,点击Java SE 8(简称JDK 8)后面的JDK下载,来到该界面,先同意协议,然后下载对应平台的JDK,我们这里下载Mac OS X ...
- 相约 DTCC 2021 | Tapdata 受邀分享:如何打造面向 TP 业务的数据平台架构
2021第十二届中国数据库技术大会(DTCC)将于2021年10月18-20日,在北京国际会议中心举行,Tapdata 创始人唐建法受邀分享:如何打造面向 TP 业务的数据平台架构. 演讲时间 ...
- Idea Maven调试properties 找不到报错
问题:maven执行package命令打包时,src/main/java路径下的properties文件偶尔丢失 解决方式:pom.xml中加入resources配置 <build> &l ...
- mysql语法使用详细代码版
mysql 1.什么是数据库 数据库:(DB,DataBase) 作用:用来存储数据,管理数据.Txt,Excel,word是在数据库出现之前存储数据的. 概念:数据仓库,安装在操作系统上的软件. 数 ...