一:总结的原因

  在最近的工作中,遇到了一个一对多关系多表数据传输,传送成功状态绑定在主数据表上,因为代码不健壮问题造成了主表传送状态更新失败,而子表数据就被重复插入。又由于数据传输频率很高,我们的测试环境就像被官方病毒攻击,疯狂插入了几十个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数据库操作回滚小结的更多相关文章

  1. @transactional注解,报错后数据库操作回滚失败

    1. https://jingyan.baidu.com/article/3a2f7c2e27d51b26afd611ff.html 2. https://blog.csdn.net/lee_star ...

  2. 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)

    MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...

  3. 复习java数据库操作的总结

    以前学习java数据库操作,学得那叫糊里糊涂,各种JDBC常用的类和接口根本是傻傻分不清啥是干嘛的.只是套着用用吧. 不过这次好歹清楚些了,呜呜,学习有阶段性,多次重复才有好效果,多么痛的领悟. 工程 ...

  4. JDBC批处理---(java 对数据库的回滚) .

    1先看一下程序: package com.redking.jdbc.demo;    import java.sql.Connection;    import java.sql.DriverMana ...

  5. MySQL数据库的回滚失败(JAVA)

    这几天在学习MySQL数据的知识,有一个小测试,用来测试数据库的提交和回滚. 刚开始的时候真的没把这个当回事,按照正常的步骤来讲的话,如下所示,加载驱动,获取数据库的连接,并且把数据库的自动提交给关闭 ...

  6. Java数据库操作

    一.JDBC 1.JDBC Java数据库连接,用于Java程序中实现数据库操作功能,java.sql包中提供了执行SQL语句,访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口及类. 2. ...

  7. Java 数据库操作

    目录 Java数据库组织架构 下载驱动包 连接数据库 连接数据库的三个步骤 连接数据库的高开销 Statement接口介绍 PreparedStatement类 使用PreparedStatement ...

  8. Java数据库操作(JDBC)

    JDBC Java数据库连接(Java DataBase Connectivity,JDBC)用于在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库 ...

  9. Java数据库操作学习

    JDBC是java和数据库的连接,是一种规范,提供java程序与数据库的连接接口,使用户不用在意具体的数据库.JDBC类型:类型1-JDBC-ODBC桥类型2-本地API驱动类型3-网络协议驱动类型4 ...

随机推荐

  1. 记录Ok6410 sd 启动uboot

    1\参考资料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-boot 2\参考资料https://blog.cs ...

  2. JavaScript判断对象有没有定义

    if ( typeof(callbackfun) != "undefined" ) { callbackfun(); }

  3. Linux VNC server 安装配置

    1.安装vnc server [root@pxe ~]# yum install tigervnc-server -y   2.设置 vnc server 开机启动 [root@pxe ~]# chk ...

  4. flutter key

    随意点开一个Widget,就会发现,可以传递一个参数Key.那这个Key到底是干啥子,有什么用呢? Flutter是受React启发的,所以Virtual Dom的diff算法也参考过来了(应该是略有 ...

  5. Java的类继承

    知识点1.继承作用:提高代码的重用性,继承之后子类可以继承父类中的属性和方法减少重复代码条件:子类和父类要满足is a的逻辑关系,才能使用继承.如:苹果 is a水果语法:使用extends 连接子类 ...

  6. Springboot 使用PageHelper分页插件实现分页

    一.pom文件中引入依赖 二.application.properties中配置以下内容(二选一方案) 第一种:pagehelper.helper-dialect=mysqlpagehelper.re ...

  7. centos7救援模式--rescue模式

    前序 经典问题:系统无法进入,如grub损坏或某个配置文件改错 操作 1 按方向键到Boot,选到Hard Driver,按减号,使其下移,最终让CD-ROM Drive到第一行,并按F10保存 2 ...

  8. 最新版的Chrome如何始终开启flash而不是先询问?

     链接:https://www.zhihu.com/question/266170237/answer/342137190  设置Chrome启用Flash,修改配置之前先看Chrome的版本,不同版 ...

  9. 字体转换网站——Font Squirrel

    转载自:http://www.5imoban.net/jiaocheng/CSS3_HTML5/2016/0714/1735.html html5之前,只要稍微特殊点的字体,都必须做成图片,以免客户端 ...

  10. 在table表格中实现圆角效果

    在table中设置border-radius发现不起作用,网上查找了一番,原因是border-collapse:collapse和border-radius不兼容. 设计图效果 代码实现效果: < ...