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 ...
 
随机推荐
- vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别
			
移动手机版要求我们在制作嵌入h5的时候去适配不同的手机.适配有多重模式,有flex.百分比等.字体大小的控制也有px.百分比.rem等单位,webpack中 px转rem. vue项目中postcss ...
 - 01:golang开发环境
			
1.1 go环境安装 1.go下载安装 官方:https://golang.org/dl 国内: https://golang.google.cn/dl/ https://www.golangtc.c ...
 - urllib3
			
urllib3是一个功能强大.条理清晰.用于http客户端的python库,相对于urllib它所有的特点如下: 线程安全 连接池 客户端SSL/TLS验证 使用多部分编码上传文件 Helpers用于 ...
 - Spring Boot 数据库连接池 Druid
			
简介 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问 ...
 - oracle 根据出生日期计算年龄的年月日
			
select years,months,abs( trunc( newer_date- add_months( older_date,years*12+months ) ) ) days from ( ...
 - react中使用antd遇到的问题
			
1.less使用报错 less配置修改一般都是1个修改1个增加 test: /\.(css|less)$/, // 修改 // 增加 { loader: require.resolve('less-l ...
 - POJ1141 Brackets Sequence---区间DP+输出路径
			
题目意思就是输入一串括号,让你找到最小的补偿数目使括号串合法,并且输出补全后的串. 基本是区间DP的模板题,该题特别让你输出补全后的答案.这和区间dp的反向思路很像,就是把一个大的区间划分为多个互不干 ...
 - centos 7 已经开启 22 端口但无法连接
			
已经开启 22 端口但无法连接 刚买的 vps ,默认 ssh 端口是 29488, 使用以下方式连接ssh -p 29488 root@x.x.x.x觉得加端口有点麻烦, 希望使用默认的 22 端口 ...
 - python 字典与json的区别
			
json:是一种数据格式,是纯字符串.可以被解析成Python的dict或者其他形式. dict:是一个完整的数据结构,是对Hash Table这一数据结构的一种实现,是一套从存储到提取都封装好了的方 ...
 - 在Altium Designer 10中实现元器件旋转45°角放置
			
Tool--->Preferences >> PCB Editor >> General 将Rotation Step(旋转的步进值)由90改为45,这样以后每次按空格键 ...