日期:2014-05-16 浏览次数:20427 次
package com.test.tx; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Savepoint; import java.sql.Statement; import com.test.jdbc.DBUtil; public class SavaPointTest { /** * @param args */ public static void main(String[] args) { try { test(); } catch (SQLException e) { e.printStackTrace(); } } /** * 保存点是可以从 Connection.rollback 方法引用的当前事务中的点。 * 将事务回滚到保存点时,在该保存点之后所作的全部更改都将被撤消。 * @throws SQLException */ static void test()throws SQLException{ Connection conn=null; Statement st=null; ResultSet rs=null; Savepoint sp=null; try{ conn=DBUtil.getConnection(); //初始化不自动提交 DBUtil.setAutoCommit(conn, false); // 张三减10元 st=conn.createStatement(); String sql="update user set money=money-10 where id=7"; st.executeUpdate(sql); sp=conn.setSavepoint();//设置了保存点 // 李四加10元 sql="update user set money=money-10 where id=9"; st.executeUpdate(sql); sql="select money from user where id=8"; rs=st.executeQuery(sql); float Money=0.0f; if(rs.next()){ Money=rs.getFloat("money"); } // 赵六的钱大于1000元(会出现异常) if(Money>1000){ throw new RuntimeException("已经超过最大值!"); } sql="update user set money=money+10 where id=8"; st.executeUpdate(sql); DBUtil.commit(conn); }catch(RuntimeException e){ if(sp!=null){ //表示提交保存点的事务 conn.rollback(sp); DBUtil.commit(conn); } throw e; }catch(SQLException e) { DBUtil.rollback(conn); throw e; } finally{ DBUtil.close(rs); DBUtil.close(st); DBUtil.close(conn); } } }