1先看一下程序:

package com.redking.jdbc.demo;   
import java.sql.Connection;   
import java.sql.DriverManager;   
import java.sql.SQLException;   
import java.sql.Statement;   
public class JDBCDemo07 {   
        public static final String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;   
        public static final String DBURL = "jdbc:odbc:testDB" ;   
        public static void main(String[] args) {   
                Connection conn = null ;   
                Statement pstmt = null ;   
                try {   
                        // 向JAVA容器中加载驱动   
                        Class.forName(DBDRIVER) ;   
                } catch (ClassNotFoundException e) {   
                        e.printStackTrace();   
                }   
                try {   
                        conn = DriverManager.getConnection(DBURL) ;   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                }   
                try {   
                        pstmt = conn.createStatement() ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael001',31)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael002',32)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael003',33)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael'http://redking.blog.51cto.com',34)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael005',35)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael006',36)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael007',37)") ;   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                }   
                //现在执行数据库的更新操作   
                try {   
                        pstmt.executeBatch() ;   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                }   
                try {   
                        pstmt.close() ;   
                } catch (SQLException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                }   
                try {   
                        conn.close() ;   
                } catch (SQLException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                }   
        }   
}

结果发现:程序报错,原因是第四条数据有问题,前面三条插进去了。

现在所有的代码确实都加入到批处理中了,但是却有点不妥当,因为在出错之前的语句都正确执行了,而出错之后的代码没有执行。应该是如果有一个出错了,则全部应该停止执行。
也就是说我们现在的程序缺少了一个事务的处理。
事务处理之前必须进行取消自动提交,在默认情况下,所有的数据都是被默认提交上去的,就是说只要一执行更新就提交。
取消自动提交之后,如果最后程序的代码(批处理代码)没有出错,则可以进行人为的手工提交。最后如果程序出现了错误,则应该进行回滚。

完善代码:
package com.redking.jdbc.demo;   
import java.sql.Connection;   
import java.sql.DriverManager;   
import java.sql.SQLException;   
import java.sql.Statement;   
public class JDBCDemo07 {   
        public static final String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;   
        public static final String DBURL = "jdbc:odbc:testDB" ;   
        public static void main(String[] args) {   
                Connection conn = null ;   
                Statement pstmt = null ;   
                try {   
                        // 向JAVA容器中加载驱动   
                        Class.forName(DBDRIVER) ;   
                } catch (ClassNotFoundException e) {   
                        e.printStackTrace();   
                }   
                try {   
                        conn = DriverManager.getConnection(DBURL) ;   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                }   
                try {   
                        pstmt = conn.createStatement() ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael001',31)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael002',32)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael003',33)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael'http://redking.blog.51cto.com',34)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael005',35)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael006',36)") ;   
                        pstmt.addBatch("INSERT INTO person(name,age) VALUES ('Michael007',37)") ;   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                }   
                //取消自动提交   
                try {   
                        conn.setAutoCommit(false);   
                } catch (SQLException e1) {   
                        // TODO Auto-generated catch block   
                        e1.printStackTrace();   
                }   
                //现在执行数据库的更新操作   
                try {   
                        pstmt.executeBatch() ;   
                        //如果没有错误,则表示可以向下执行   
                        //手工提交   
                        conn.commit();   
                } catch (SQLException e) {   
                        e.printStackTrace();   
                        //如果出错了,则应该把数据回滚   
                        try {   
                                conn.rollback();   
                        } catch (SQLException e1) {   
                                // TODO Auto-generated catch block   
                                e1.printStackTrace();   
                        }   
                }   
                try {   
                        pstmt.close() ;   
                } catch (SQLException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                }   
                try {   
                        conn.close() ;   
                } catch (SQLException e) {   
                        // TODO Auto-generated catch block   
                        e.printStackTrace();   
                }   
        }   
}
就发现程序出错,全部没有插进去。

JDBC批处理---(java 对数据库的回滚) .的更多相关文章

  1. 复习课程jdbc:使用配置文件properties进行连接数据库,数据库存取图片,批处理,时间戳,事物回滚等等

    使用配置文件properties进行连接数据库 首先创建一个file自定义文件名,但是后缀名必须改为.properties(不分大小写):如config.properties: 然后双击config. ...

  2. JAVA数据库操作回滚小结

    一:总结的原因 在最近的工作中,遇到了一个一对多关系多表数据传输,传送成功状态绑定在主数据表上,因为代码不健壮问题造成了主表传送状态更新失败,而子表数据就被重复插入.又由于数据传输频率很高,我们的测试 ...

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

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

  4. JDBC 数据库连接 Java操作数据库 jdbc快速入门

    JDBC基本概念 Java DataBase Connectivity 数据库连接 java操作数据库 本质上(sun公司的程序员)定义的一套操作关系型数据库的规则 既接口  更新内容之前 代码 pa ...

  5. ThinkPHP 实现数据库事务回滚示例代码

    ThinkPHP提供了数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法:   启动事务: $User->startTrans(); 提交事务: $User->commit( ...

  6. 记一次腾讯云MySQL数据库数据回滚

    如题,因为操作人员的问题,需要对数据库数据进行回滚. 可以看到,设置了7天自动备份,且是物理冷备. 什么是物理冷备?科普一下: (1)热备:在数据库运行时,直接进行备份,对运行的数据库没有影响.(2) ...

  7. MSSQL Server Transaction 数据库事务回滚的用法

    使用的表结构如下:         Commit TransAction    Else        Rollback TransAction/*    自定义一个变量来判断最后是否发生过错误.*/ ...

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

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

  9. JDBC核心技术(获取数据库链接、数据库事务、数据库链接池)

    @ 目录 前言 数据的持久化 Java数据存储技术 JDBC介绍 JDBC体系结构 获取数据库链接 Driver接口 加载注册JDBC驱动 获取数据库链接 数据库链接方式(实例) 方式一:代码中显示出 ...

随机推荐

  1. Sqlite: unable to open database file

    A database connect, there updated both queries (different statement, and regardless of order), after ...

  2. 动态模板中 SWIPER 划不动问题

    原文: 地址:http://hao.jser.com/archive/8030/ 作者:segmentfault 问题: 动态循环生成swiper-slide类,在swiper-wrapper里生成6 ...

  3. Week1 Team Homework #2 Introduction of team member with photos

    小组成员介绍 组长:黄剑锟       11061164 组员:顾泽鹏        11061160 组员:周辰光         11061154 组员:龚少波        11061167 组 ...

  4. 屌丝IT男

    偶尔翻到豆瓣里一篇对中国屌丝的批评,突然想到当年美国那个垮掉的一代,吸毒,淫乱,绝望的生存,而如今我们苦逼的80后自诩为屌丝的时候,也不想想每一个堕落的时代还是有牛逼的人存在,中国的大学,绝大部分在逃 ...

  5. Android 开发 res里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)

    (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854) (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x ...

  6. EntityFramework Add方法与Attach区别

    一 先发问. 问题:在使用EF过程中,能否有一个方法可以直接执行传入的SQL语句.纠结的只找到了调用存储过程的方法,难道要SqlHelper.cs?    二 友情提示 本文内容参考自MSDN. 三 ...

  7. 简单制作mib表

    今天放假后第一天上班,将假前自学制作mib表的东西说一下. 在这里呢,我以世界-中国-上海-闵行这种包含关系介绍,感觉更容易理解. MIB file的开始和结束 所有的MIB file的都以DEFIN ...

  8. lamada 表达式之神奇的groupby

    少说话多干活 先定义一个测试用的实体,接下来会用字段Name进行分组的 public class TestToRun { public string Name { get; set; }//名称 pu ...

  9. mysql数据库备份及恢复命令mysqldump,source的用法

    还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root ...

  10. 20160728noip模拟赛zld

    前言:单独对题面描述的评分-> [题解]把相邻长度为2的子串两两连边,跑欧拉路 /*明天再写,先贴一份方老师代码压压惊*/ #include<map> #include<sta ...