SavePoint 回滚部分事务。
package cn.lib.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
import java.util.Date;
import javax.management.RuntimeErrorException;
//事务测试
public class SavePointTxTest {
public static void main(String[] args) throws SQLException {
test();
}
public static void test() throws SQLException {
Connection con = null;
ResultSet rs = null;
Statement st = null;
Savepoint sp=null;
try {
con = JdbcUtil.getConnection();
con.setAutoCommit(false);
st = con.createStatement();
String sql = "update person set money=money-100 where id=2";
st.executeUpdate(sql);
sp=con.setSavepoint();
sql="update person set money=money-100 where id=4";
st.executeUpdate(sql);
sql = "select money from person where id=3";
rs = st.executeQuery(sql);
int money = 0;
if (rs.next()) {
money = rs.getInt("money");
}
if (money > 300) {
throw new RuntimeException("已经超过最大值");
}
sql = "update person set money=money+100 where id=2";
st.executeUpdate(sql);
con.commit();
}
catch (RuntimeException e) {
if(con!=null && sp!=null){
con.rollback(sp);
con.commit();
}
throw e;
}
catch (SQLException e) {
con.rollback();
throw e;
}
finally {
JdbcUtil.free(rs, st, con);
}
}
}