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();
			}
		}
	}
}
⚠️ **GitHub.com Fallback** ⚠️