【学习笔记】简单的用户转账事务操作

事务:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

以下用用户转账实例说明事务操作。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
 *	通过转账实现事务
 * @param args
 */
public class TestTransaction {
	//数据库url
	private static String url = "jdbc:mysql://localhost:3306/blogdb?serverTimezone=Asia/Shanghai";
	private static String user = "root";
	private static String pwd = "123456";
	public static void main(String[] args) {

	}
	public static void trans(int fromid,int toid,double balance) {
		Connection conn = null;
		PreparedStatement ps1 = null;
		PreparedStatement ps2 = null;
		//余额变动的sql语句
		String sql1 = "update trans set balance+?where uid=?";
		String sql2 = "update trans set balance-?where uid=?";
		try {
			//加载驱动
			Class.forName("com.mysql.cj.jdbc.Driver");
			//获取连接
			conn = DriverManager.getConnection(url, user, pwd);
			//手动设置提交事务
			conn.setAutoCommit(false);
			ps1 = conn.prepareStatement(sql1);
			//调用setParameters方法为ps1设置参数
			setParameters(ps1, balance,toid);
			//执行修改操作
			int n1 = ps1.executeUpdate();
			
			//转账过程中可能出现异常,这里手动制造异常,用于说明事务回滚的作用
			System.out.println(4/0);
			
			ps2 = conn.prepareStatement(sql2);
			setParameters(ps2, balance,fromid);
			int n2 = ps2.executeUpdate();
			
			//如果两个sql语句都正常执行,说明转账成功
			if (n1>0 && n2>0) {
				//手动提交事务
				conn.commit();
			}else {
				//如果转账过程中出现异常,则事务回滚,保障转账人的财产安全
				conn.rollback();
			}
		} catch (Exception e) {
			//如果转账过程中出现异常,则事务回滚,保障转账人的财产安全
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally {
			try {
				ps1.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				ps2.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 *	为PreparedStatement对象设置参数
	 * @param ps PreparedStatement对象
	 * @param params 可变参数名
	 * @throws SQLException SQL异常
	 */
	public static void setParameters(PreparedStatement ps,Object...params) throws SQLException {
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i+1, params[i]);
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值