package cn.yutao.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
/**
* JDBC事务的保存点处理
*
* 在JDBC的事务处理中,可以应用保存点技术,对一个事务中的处理进行部分提交。
*
* @author liuyutao
*
*/
public class SavePoint {
/**
* 加载驱动类、建立连接
*
* A:先把connection设置成不进行自动提交
*
* B:中间设定保存点
*
* C:回滚的地方要使用保存点
*
* D:最后不要忘记进行commit()提交事务
*
* @param args
*/
public static void main(String[] args) throws SQLException {
test();
}
/**
* 本例测试事务的保存点
*
* 先修改张三的钱数,设置保存点,再修改王五的钱数,判断李四的钱数是否大于300,是:则抛异常,进行回滚到保存点的操作
*
*
* @throws SQLException
*/
static void test() throws SQLException {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
Savepoint sp = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");
// 初始化不自动提交
conn.setAutoCommit(false);
st = conn.createStatement();
// 张三减去10元
String sql = "update user set money=money-10 where id =1";
st.executeUpdate(sql);
// 设置事务的保存点
sp = conn.setSavepoint();
// 王五减10元
sql = "update user set money=money-10 where id =3";
st.executeUpdate(sql);
// 查询的是李四的钱数
sql = "select * from user where id =2";
rs = st.executeQuery(sql);
float money = 0.0f;
if (rs.next()) {
money = rs.getFloat("money");
}
// 判断李四的钱数是否大于300
if (money > 400) {
throw new RuntimeException("已经超过最大值");
}
sql = "update user set money=money+10 where id =2";
st.executeUpdate(sql);
conn.commit();
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
} catch (RuntimeException e) {
// 如果李四的钱数大于300,则抛出RuntimeException异常
if (conn != null && sp != null) {
// 进行回滚操作
conn.rollback(sp);
System.out.println("回滚到张三减去10元的状态!");
conn.commit();
}
throw e;
} catch (SQLException e) {
if (conn != null) {
conn.rollback();
}
throw e;
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
Jdbc中事务的保存点解析
最新推荐文章于 2021-02-24 02:56:49 发布