JDBC事务 - Deep-Web/MarkDownPhotos GitHub Wiki
package com.java1234.jdbc.chap09.sec03;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Savepoint;
import com.java1234.jdbc.util.DbUtil;
public class Demo1 {
private static DbUtil dbUtil=new DbUtil();
/**
* ת��
* @param con
* @param accountName
* @param account
* @throws Exception
*/
private static void outCount(Connection con,String accountName,int account)throws Exception{
//建立SQL语句 String sql="update t_account set accountBalance=accountBalance-? where accountName=?"; //建立SQL执行器,这个比statement效率高,并且可以设置参数? PreparedStatement pstmt=con.prepareStatement(sql); //设置SQL语句第一个参数 pstmt.setInt(1, account); //设置SQL语句第二个参数 pstmt.setString(2, accountName); //执行SQL语句 pstmt.executeUpdate(); }
/**
* ת��
* @param con
* @param accountName
* @param account
* @throws Exception
*/
private static void inCount(Connection con,String accountName,int account)throws Exception{
String sql="update t_account set account=accountBalance+? where accountName=?";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setInt(1, account);
pstmt.setString(2, accountName);
pstmt.executeUpdate();
}
public static void main(String[] args) {
//数据库连接
Connection con=null;
//事务保存点
Savepoint sp=null;
try {
//获取与数据的连接 con=dbUtil.getCon(); //jdbc取消事务自动提交 con.setAutoCommit(false); // 取消事务自动提交
//定义金额 int account=500; //张三转出500元 outCount(con, "张三", account);
//设置事务保存点,事务回滚时的指定位置、、一般不需要使用事务保存点 sp=con.setSavepoint();
//李四转入500元 inCount(con, "李四", account);
} catch (Exception e) {
try {
con.rollback(); // 回滚事务(如果设置保存点,会回滚到事务保存点,如果没有设置事务保存点,那么整个connection就是一个事务)
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
//用连接提交事务
con.commit();
//关闭连接
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}