先上代码,(此代码参考传智播客李勇老师的JDBC视频)。
/**
* @ Title: JDBC_ACID1.java
* @ Package: com.ynsf.web.test
* @ Description: TODO
* @ Author: huangyuze
* @ Date: Oct 10, 2013 11:14:24 PM
* @ Version V1.0
*/
package com.ynsf.web.test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
import org.junit.Test;
import com.ynsf.web.dbutil.DataBaseConnection;
/**
* @ ProjectName: MyFirstWeb
* @ PackgeName: com.ynsf.web.test
* @ ClassName: JDBC_ACID1
* @ Description: 事务的保存点处理(回滚到保存点)
* @ Author: huangyuze
* @ Date: Oct 10, 2013 11:14:24 PM
* @ Version: V1.0
*/
public class JDBC_ACID1 {
private Connection conn = null;
private ResultSet rs = null;
private Statement st = null;
DataBaseConnection dbc = new DataBaseConnection();
Savepoint sp = null;
@Test
public void test(){
this.conn = this.dbc.getDBS();//取得数据库资源
String sql1 = "UPDATE jdbc_acid SET money = money + 1000 WHERE name = '张三'";
String sql2 = "SELECT money FROM jdbc_acid WHERE name = '李四'";
String sql3 = "UPDATE jdbc_acid SET money = money - 1000 WHERE name = '李四'";
String sql4 = "UPDATE jdbc_acid SET money = money + 2000 WHERE name = '王武'";
try {
this.conn.setAutoCommit(false);//打开事务
this.st = this.conn.createStatement();
this.st.executeUpdate(sql1);
//设置事务保存点
(1) sp = this.conn.setSavepoint();
this.rs = this.st.executeQuery(sql2);
float money = 0.0f;
while(rs.next()){
money = rs.getFloat(1);
}
if(money < 6000){
throw new RuntimeException("已超过最大限额。");
}else{
this.st.executeUpdate(sql3);
}
this.st.executeUpdate(sql4);//更新王武的数据
(2) this.conn.commit();//提交事务
} catch (RuntimeException e) {
// TODO Auto-generated catch block
if(this.conn != null && this.sp != null){
try {
this.conn.rollback(sp);//回滚
this.conn.commit();
} catch (RuntimeException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException x) {
// TODO Auto-generated catch block
x.printStackTrace();
}
}
}catch(SQLException e2){
if(this.conn != null){
try {
this.conn.rollback();
} catch (SQLException e3) {
// TODO Auto-generated catch block
e3.printStackTrace();
}
}
}
finally{
if(rs != null){
try {
this.rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(st != null){
try {
this.st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.dbc.closeDBS();
}
}
}
1、在JDBC中,可以使用保存点技术,对一个事物中的处理进行部分处理。
2、在(1)处设置保存点,保存点以后的代码中,若出现异常,则进行回滚,但是只回滚到保存点,而保存点之前的代码是执行的,虽然他们在同一个事物中,以此实现事物部分处理。
3、保存点技术总结:
A、this.conn.setAutoCommit(false); 设置成不自动提交。
B、中间设置保存点。
C、出现异常,回滚到设置的保存点。
D、this.conn.commit(); 提交事物