JAVA数据库操作回滚小结
一:总结的原因
在最近的工作中,遇到了一个一对多关系多表数据传输,传送成功状态绑定在主数据表上,因为代码不健壮问题造成了主表传送状态更新失败,而子表数据就被重复插入。又由于数据传输频率很高,我们的测试环境就像被官方病毒攻击,疯狂插入了几十个G的数据……
二:解决步骤
1.提高代码健壮性,先进行主表状态能否成功更新判断,再插入子表数据,最后再更新主表状态。
2.进一步提高容错率:将这些存在关系的表的更新集成到一个事物,全部更新都正常执行后,再提交事务。
三:技术实现
public void doManipulateData(){
Connection connection = getConnection();//获取当前环境的连接
try {
connection.setAutoCommit(false);//设置不能自动提交
//1.执行普通的增删改查语句
doADUS(connection);
//2.执行存储过程
doStoredPro(connection);
connection.commit(); //手动提交
connection.setAutoCommit(true);//设置可以自动提交
} catch (SQLException e) {
try {
connection.rollback(); //回滚此次链接的所有操作
connection.setAutoCommit(true); //设置可以自动提交
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
connection.close();//关闭连接
}
}
/*
* 执行普通的增删改查语句
*/
public void doADUS(Connection connection) throws Exception{
String sql = "...";
PreparedStatement ps = null;
try {
ps = connection.prepareStatement(sql);
ps.setString(1, appId); //ps.setBinaryStream(2, arg1, arg2)
ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
ps.close();
}
}
/*
* 执行存储过程
*/
public void doStoredPro(Connection connection) throws Exception{
CallableStatement cs = null;
try {
cs = connection.prepareCall("{call 过程名称(?,?)}");
cs.setString(1, "");
cs.registerOutParameter(2, Types.INTEGER);//存储过程执行返回数据
cs.execute();
if (cs.getInt(2) != 0) {
throw new Exception("存储过程执行失败!");
}
} catch (Exception e) {
throw e;
} finally {
ps.close();
}
}
四:注意事项
1.java.sql.PreparedStatement.setBinaryStream(int parameterIndex, InputStream x, long length) 方法,jdbc并没有提供相应的接口,运行时会报错。需要使用 java.sql.PreparedStatement.setBinaryStream(int parameterIndex, InputStream x, int length)
2.PreparedStatement 建立的sql对象只编译一次,可使用占位符安全的插入。Statement每次执行sql时都会重新编译一次sql,不能使用占位符
JAVA数据库操作回滚小结的更多相关文章
- @transactional注解,报错后数据库操作回滚失败
1. https://jingyan.baidu.com/article/3a2f7c2e27d51b26afd611ff.html 2. https://blog.csdn.net/lee_star ...
- 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...
- 复习java数据库操作的总结
以前学习java数据库操作,学得那叫糊里糊涂,各种JDBC常用的类和接口根本是傻傻分不清啥是干嘛的.只是套着用用吧. 不过这次好歹清楚些了,呜呜,学习有阶段性,多次重复才有好效果,多么痛的领悟. 工程 ...
- JDBC批处理---(java 对数据库的回滚) .
1先看一下程序: package com.redking.jdbc.demo; import java.sql.Connection; import java.sql.DriverMana ...
- MySQL数据库的回滚失败(JAVA)
这几天在学习MySQL数据的知识,有一个小测试,用来测试数据库的提交和回滚. 刚开始的时候真的没把这个当回事,按照正常的步骤来讲的话,如下所示,加载驱动,获取数据库的连接,并且把数据库的自动提交给关闭 ...
- Java数据库操作
一.JDBC 1.JDBC Java数据库连接,用于Java程序中实现数据库操作功能,java.sql包中提供了执行SQL语句,访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口及类. 2. ...
- Java 数据库操作
目录 Java数据库组织架构 下载驱动包 连接数据库 连接数据库的三个步骤 连接数据库的高开销 Statement接口介绍 PreparedStatement类 使用PreparedStatement ...
- Java数据库操作(JDBC)
JDBC Java数据库连接(Java DataBase Connectivity,JDBC)用于在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库 ...
- Java数据库操作学习
JDBC是java和数据库的连接,是一种规范,提供java程序与数据库的连接接口,使用户不用在意具体的数据库.JDBC类型:类型1-JDBC-ODBC桥类型2-本地API驱动类型3-网络协议驱动类型4 ...
随机推荐
- 记录Ok6410 sd 启动uboot
1\参考资料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-boot 2\参考资料https://blog.cs ...
- JavaScript判断对象有没有定义
if ( typeof(callbackfun) != "undefined" ) { callbackfun(); }
- Linux VNC server 安装配置
1.安装vnc server [root@pxe ~]# yum install tigervnc-server -y 2.设置 vnc server 开机启动 [root@pxe ~]# chk ...
- flutter key
随意点开一个Widget,就会发现,可以传递一个参数Key.那这个Key到底是干啥子,有什么用呢? Flutter是受React启发的,所以Virtual Dom的diff算法也参考过来了(应该是略有 ...
- Java的类继承
知识点1.继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足is a的逻辑关系,才能使用继承.如:苹果 is a水果语法:使用extends 连接子类 ...
- Springboot 使用PageHelper分页插件实现分页
一.pom文件中引入依赖 二.application.properties中配置以下内容(二选一方案) 第一种:pagehelper.helper-dialect=mysqlpagehelper.re ...
- centos7救援模式--rescue模式
前序 经典问题:系统无法进入,如grub损坏或某个配置文件改错 操作 1 按方向键到Boot,选到Hard Driver,按减号,使其下移,最终让CD-ROM Drive到第一行,并按F10保存 2 ...
- 最新版的Chrome如何始终开启flash而不是先询问?
链接:https://www.zhihu.com/question/266170237/answer/342137190 设置Chrome启用Flash,修改配置之前先看Chrome的版本,不同版 ...
- 字体转换网站——Font Squirrel
转载自:http://www.5imoban.net/jiaocheng/CSS3_HTML5/2016/0714/1735.html html5之前,只要稍微特殊点的字体,都必须做成图片,以免客户端 ...
- 在table表格中实现圆角效果
在table中设置border-radius发现不起作用,网上查找了一番,原因是border-collapse:collapse和border-radius不兼容. 设计图效果 代码实现效果: < ...