Jdbc中事务的保存点解析

来源:互联网 发布:gta5卡顿优化 编辑:程序博客网 时间:2024/05/21 07:49
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");}// 判断李四的钱数是否大于300if (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();}}}}}}

2 0