您的位置:首页 > 编程语言 > Java开发

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

2016-07-22 09:07 387 查看
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();    

    
91c6
           } 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();    

                }    

        }    

}

就发现程序出错,全部没有插进去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: