zoukankan      html  css  js  c++  java
  • JDBC批处理---(java 对数据库的回滚) .

    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();   
                    }   
            }   
    }
    就发现程序出错,全部没有插进去。

  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/firstdream/p/5482713.html
Copyright © 2011-2022 走看看