我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【JDBC】笔记(4)-

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【JDBC】笔记(4)-

【JDBC】笔记(4)-

但是在实际的业务中,通常是多条 DML语句 联合完成的,那么就必须保证这些 DML语句 在同一个事务中同时成功或失败......

楔子:

   JDBC 的事务默认是自动提交的:

   只要执行一条 DML语句,则自动提交一次。但是在实际的业务中,通常是多条 DML语句 联合完成的,那么就必须保证这些 DML语句 在同一个事务中同时成功或失败!!!

   否则这会是一个非常严重的bug!!!


 

import java.sql.*;



public class JDBCTransactionTest01 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement ps = null;
        int count = 0;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode"
                    , "root", "888");

            String sql = "update t_act set balance = ? where actno = ?";
            ps = connection.prepareStatement(sql);
            ps.setDouble(1, 0);
            ps.setDouble(2, 5566);

            count = ps.executeUpdate();

            String s = null;
            s.toString();

            String sql0 = "update t_act set balance = ? where actno = ?";
            ps = connection.prepareStatement(sql0);
            ps.setDouble(1, 1000);
            ps.setDouble(2, 1314);

            count += ps.executeUpdate();
            System.out.println("更新数据:" + count + "条");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(count == 2?"转账成功":"转账失败");
        }
    }
}

 

IDEA控制台输出结果:

java.lang.NullPointerException
	at com.bjpowernode.jdbc.JDBCTransactionTest01.main(JDBCTransactionTest01.java:48)
转账失败

Process finished with exit code 0

 

现在瞅一眼 t_act:

  +-------+---------+
  | actno | balance |
  +-------+---------+
  |  5566 |    0.00 |
  |  1314 |    0.00 |
  +-------+---------+

哎呀我去,这bug太严重了,钱都飞了!!


 

import java.sql.*;

public class JDBCTransactionTest02 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement ps = null;
        int count = 0;

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode"
                    , "root", "888");

            //将自动提交机制修改为手动提交
            connection.setAutoCommit(false);

            String sql = "update t_act set balance = ? where actno = ?";
            ps = connection.prepareStatement(sql);
            ps.setDouble(1, 0);
            ps.setDouble(2, 5566);

            count = ps.executeUpdate();

            String s = null;
            s.toString();

            String sql0 = "update t_act set balance = ? where actno = ?";
            ps = connection.prepareStatement(sql0);
            ps.setDouble(1, 1000);
            ps.setDouble(2, 1314);

            count += ps.executeUpdate();
            System.out.println("更新数据:" + count + "条");

            //程序执行到这说明没有异常,事务结束,手动提交数据
            connection.commit();
        } catch (Exception e) {
            //如果出现异常,回滚事务
            if (connection != null) {
                try {
                    connection.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(count == 2?"转账成功":"转账失败");
        }
    }
}

 

IDEA控制台输出结果:

java.lang.NullPointerException
	at com.bjpowernode.jdbc.JDBCTransactionTest02.main(JDBCTransactionTest02.java:31)
转账失败

Process finished with exit code 0

 

现在瞅一眼 t_act:

  +-------+---------+
  | actno | balance |
  +-------+---------+
  |  5566 | 1000.00 |
  |  1314 |    0.00 |
  +-------+---------+

虽然因为某些原因导致转账失败,但是数据库中储存的数据一切正常,而且控制台也给出了提示(转账失败),所以总结:此转账程序非常成功!


 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【JDBC】笔记(4)-

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【JDBC】笔记(4)-

但是在实际的业务中,通常是多条 DML语句 联合完成的,那么就必须保证这些 DML语句 在同一个事务中同时成功或失败...... 楔子:   JDBC 的事务默认是自动提交的:   只要执行一条 DML语句,则自动提交一次。但是在实际的业务中,通常是多条
【JDBC】笔记(4)-
2021-09-15

【JDBC】笔记(3)-

1.Statement 编译一次,只执行一次,PreparedStatement 编译一次,可执行n次,所以 PreparedStatement 效率较高...... 一.实现功能:    1.解决“应用Statement的登录系统”存在的SQL注入问题
【JDBC】笔记(3)-
2015-01-20

【JDBC】笔记(5)-

总结:在当前事务中,用行级锁锁住的记录,那么在此事务结束之前,其他事务将无法对“锁住的记录”进行操作(update/delete),但是select可以...... 1.悲观锁和乐观锁的概念:2.演示行级锁机制:注意:DBUtil类 为博主之前自己写的类
【JDBC】笔记(5)-
2019-02-13

【JDBC】笔记(1)-

2、JDBC的本质是什么?JDBC是SUN公司制定的一套接口(实质); java.sql.*; (这个软件包下有很多接口) 1、JDBC是什么?    Java DataBase Connectivity(Java语言连接数据库)2、JDBC的本质是什么
【JDBC】笔记(1)-
2017-05-31

【JDBC】笔记(2)-

1、需求:模拟用户登录功能的实现;2、业务描述:程序运行的时候,提供输入的入口,可以让用户输入用户名和密码;用户输入用户名和密码后,提交信息,java程序收集到用户信息..... 一.实现功能:    1、需求:        模拟用户登录功能的实现 
【JDBC】笔记(2)-
2020-11-05

【MySQL】笔记(4)-

8.7、索引的实现原理:通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的...... 一.创建表:1.1 建表语句的语法
【MySQL】笔记(4)-
2022-02-11

Python爬虫笔记4-Beautif

BeautifulSoup介绍与lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML数据。几种解析工具的对比工具速度难度 正则表达式最快困难 BeautifulSoup慢最简单
2023-01-31

Python 学习笔记 (4)—— 模块

模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。        模块可以从其他程序 输入 以便利用它的功能。这也是我们使用Python标准库的方法。首先,我们将学习如何使用标
2023-01-31

Python学习笔记4——函数

函数1 # 函数需要先定义,关键字 def2 def func():3 print("我是一个函数")4 5 # 函数的调用6 func()执行结果:我是一个函数内建函数(内置函数)help(), print(), format()
2023-01-30

python运维开发笔记4

1.函数如何被调用,通过return返回值来调用2.生成器和return区别yield 生成器返回对象,可以迭代可以执行glob模块 类似shell中的正则匹配shlex模块  Popen 将命令参数直接分词cmd = "ps ax -o
2023-01-31

DBA入职指南学习笔记4

表空间相关: http://blog.itpub.net/31535677/viewspace-2154486/ 1、创建表空间并指定数据文件      create tablespace ecologytest datafile "D:apporacleor
DBA入职指南学习笔记4
2021-07-19

MySQL学习笔记(4):数据类型

本文更新于2019-06-19,使用MySQL 5.7,操作系统为Deepin 15.4。目录数值类型整数类型定点数类型浮点数类型位类型日期时间类型字符串类型枚举类型集合类型数值类型整数类型type[(m)] [UNSIGNED] [ZEROFILL] [AU
MySQL学习笔记(4):数据类型
2019-09-06

实战笔记丨JDBC问题定位指南

JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集。JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批组件之一。 JDBC问题基础知识 JDBC问题是指比较宽泛的
实战笔记丨JDBC问题定位指南
2021-09-22

java大数据最全课程学习笔记(4)-

目前CSDN,云海天,简书同步发表中,更多精彩欢迎访问我的gitee pages目录HDFS NN,2NN,DN及HDFS2.x新特性NameNode和SecondaryNameNode(重点)NN和2NN工作机制NN和2NN工作机制详解Fsimage和Edi
java大数据最全课程学习笔记(4)-
2021-10-12

Python入门学习笔记4:他人的博客及

看其他人的学习笔记,可以保证自己不走弯路。并且一举两得,即学知识又学方法!廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542
2023-01-30

django笔记

装饰器:require_http_method()当然你可以在视图函数内丢弃那些期望之外的请求(比如上例中的POST /report/1234/), 但更简单的做法是使用Django预置的require_http_methods(metho
2023-01-30

Python笔记

列表[List] 元组(truple) 字典{dict}# 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推# list comprehension[i for i in range(10)]#
2023-01-31

redis笔记-

前言为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务作用:数据备份扩展读性能(读写分离)复制方式:全量复制部分复制 实现方式 1、一主二扑 A(B、C) 一个Master两个Slave2、
redis笔记-
2021-09-21

编程热搜

目录