java mysql 回滚_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();

}

}

}

就发现程序出错,全部没有插进去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值