数据库的操作对事务这一概念非常重要,事务的概念是一个不可分割的整体,具有原子性。比如银行转账,当从一方扣钱完毕出现异常,结果接收方没有收到钱,这样是绝对不行的,所以需要回滚,这就是事务。
下面呈上例子代码,这里模仿从一个人的钱里面扣钱,但是回滚到指定的地方,其实首先需要指定自动提交为false,然后一直等到所有事务处理完毕才能提交,然后可以设置保存点,然后回滚的时候回滚到指定的位置。
package com.bird.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Savepoint; import com.bird.jdbc.dao.DaoException; public class TxTest { /** * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { test(); } public static void test() throws SQLException{ Connection con = null; PreparedStatement ps = null; ResultSet rs = null; Savepoint sp = null; try { con = Temple.getConnection(); con.setAutoCommit(false);//设置自动提交为false,禁止自动提交 String sql = "update user set money=money-10 where id=1"; ps = con.prepareStatement(sql); ps.executeUpdate(); sp = con.setSavepoint(); sql = "update user set money=money-10 where id=3"; ps=con.prepareStatement(sql); ps.executeUpdate(); sql = "select money from user where id=2"; ps = con.prepareStatement(sql); rs = ps.executeQuery(); float money = 0.0f; if(rs.next()){ money = rs.getFloat("money"); } if(money > 200) throw new RuntimeException("钱够多了,超过最大值"); sql = "update user set money=money+10 where id=2"; ps=con.prepareStatement(sql); ps.executeUpdate(); con.commit();//一并提交,放到一个事件中去 } catch (RuntimeException e) { if(con != null && sp != null) con.rollback(sp); con.commit(); throw new DaoException(e); } catch (SQLException e) { if(con != null) con.rollback(); throw new DaoException(e); } finally{ Temple.free(con, ps, rs); } } } 虽然代码很短,而且关于事务的代码其实是很少的,所以好好记住