数据库的操作对事务这一概念非常重要,事务的概念是一个不可分割的整体,具有原子性。比如银行转账,当从一方扣钱完毕出现异常,结果接收方没有收到钱,这样是绝对不行的,所以需要回滚,这就是事务。
下面呈上例子代码,这里模仿从一个人的钱里面扣钱,但是回滚到指定的地方,其实首先需要指定自动提交为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);
}
}
}
虽然代码很短,而且关于事务的代码其实是很少的,所以好好记住