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

  • 相关阅读:
    为应用程序的选项卡及ActionBar设置样式
    在Flex中定义移动设备应用程序和启动屏幕
    在Flex中用于处理XML对象的E4X 方法
    在移动设备应用程序中嵌入字体
    【2020-01-14】一些不起眼的常态局限
    【2020-01-13】一点一点的,一点一点的
    【2020-01-12】昨天跟老骨干聚了个会
    【2020-01-11】多警惕自己的自圆其说
    【2020-01-10】每天早上一个小时的自我修养
    【2020-01-09】看书就是一种很好的娱乐
  • 原文地址:https://www.cnblogs.com/firstdream/p/5482713.html
Copyright © 2011-2022 走看看