代码先锋网 代码片段及技术文章聚合

MySQL数据库事务实例(模拟银行转账)

在数据库系列文章中[MySQL数据库事务基本操作](http://blog.csdn.net/fengpojian/article/details/73571983)
介绍了MySQL数据库基本的事务操作。这篇文章将介绍一个实例来更好的理解学习MySQL数据库事务。
这个Demo主要是模拟银行转账的过程,两个账户发生转账关系时,首先改变双方账户的余额状态。
随后验证转出方账户是否有足够的余额来支撑此次的转账操作,若余额不足,则抛出“账户余额不足”异常。
请注意,这个Demo只适用于单线程的情况。
java
/**
 * 单线程下的数据库事务
 * 模拟银行转账
 * @author LinGer
 *
 */
public class Transaction
{
    public boolean transfrom(int fromId, int toId, double amount)
    {
        Connection con = MyUtil.getCon();
        String sql1 = "update tb_account set balance = balance - ? where userId = ?;";
        String sql2 = "update tb_account set balance = balance + ? where userId = ?;";
        String sql3 = "select balance  from tb_account where userId = ?;";
        PreparedStatement ps1 = null;
        PreparedStatement ps2 = null;
        PreparedStatement ps3 = null;
        ResultSet rs = null;
        try
        {
            //开启事务
            con.setAutoCommit(false);
            //转账时涉及的两个账户以及各账户的金额变动
            ps1 = con.prepareStatement(sql1);
            ps1.setDouble(1, amount);
            ps1.setInt(2, fromId);
            ps1.executeUpdate();

            ps2 = con.prepareStatement(sql2);
            ps2.setDouble(1, amount);
            ps2.setInt(2, toId);
            ps2.executeUpdate();

            //检查转出方账户的余额是否足够支持此次转账金额;如果余额不足,则抛出“余额不足”异常,并回滚
            ps3 = con.prepareStatement(sql3);
            ps3.setInt(1, fromId);
            rs = ps3.executeQuery();
            Double balance = 0.0;
            if(rs.next())
            {
                balance = rs.getDouble("balance");
            }
            if(balance < 0)
            {
                throw new Exception("账户余额不足");
            }
            con.commit();
            return true;
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        try
        {
            con.rollback();
        } catch (SQLException e)
        {
            e.printStackTrace();
        }finally{
            try
            {
                rs.close();
                ps1.close();
                ps2.close();
                ps3.close();
                con.close();
            } catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
        return false;
    }
}
java
/**
 * 工具类 获得Connection连接
 * @return
 */
public static Connection getCon()
    {
        String DBDriver = "com.mysql.jdbc.Driver";
        String DBUrl = "jdbc:mysql://localhost:3306/study?autoReconnect=true&"
                + "failOverReadOnly=false&useUnicode=true&characterEncoding=UTF-8";
        String name = "root";
        String pass = "123";
        Connection con = null;
        try {
            Class.forName(DBDriver);
            con = DriverManager.getConnection(DBUrl,name,pass);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return con;
    }
java
/**
 * 实体类 模拟银行账户
 * @author LinGer
 *
 */
public class User
{
    private int userId;
    private String userName;
    private Double balance; //账户余额

    //get && set
    public int getUserId()
    {
        return userId;
    }
    public void setUserId(int userId)
    {
        this.userId = userId;
    }
    public String getUserName()
    {
        return userName;
    }
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
    public Double getBalance()
    {
        return balance;
    }
    public void setBalance(Double balance)
    {
        this.balance = balance;
    }
}
这篇博客的代码参考了https://www.oschina.net/code/snippet_2271303_44733#62843
非常感谢博主。
版权声明:本文为fengpojian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fengpojian/article/details/73603466

智能推荐

编写银行转账系统的数据库

//工具类,用来存放连接驱动,获得连接,关闭连接 //存放在.prepareties的文件中用来保存,经常变动的对象。 //用来输入信息,并获得转账。 //工具类service,用来存放计算转账、与验证消息。...

JDBC(概念 连接步骤 快速入门 模拟登陆 查询数据库 SQl注入与防范问题 存储过程与函数 批处理 事务 事务隔离级别 银行转账案例)

JDBC(概念 连接步骤 快速入门 模拟登陆 查询数据库 SQl注入与防范问题 存储过程与函数 批处理 事务 事务隔离级别 银行转账案例) 文章目录 JDBC(概念 连接步骤 快速入门 模拟登陆 查询数据库 SQl注入与防范问题 存储过程与函数 批处理 事务 事务隔离级别 银行转账案例) JDBC的概念 JDBC连接步骤 JDBC快速入门 1.引入MySQL的驱动jar包 添加依赖 2. 加载驱动...

模拟银行系统转账 python+mysql

学习的地址:https://blog.csdn.net/xunalove/article/details/76691196 使用Python DB API 访问数据库的流程: 开始—->创建connection—->获取cursor—->执行查询, 执行命令, 获取数据, 处理数据—->关闭cursor —->...

猜你喜欢

调用API对Mysql数据库实现增删改查以及事务实现

使用API实现增删改查客户端代码:     使用API操作事务:   ...

数据库转账事务处理

数据库转账事务处理...

模拟数据库转账事务,运用ThreadLocal获得一个当前线程,完成分层

Acount类,账户,与数据库一致 public class Account { private int id; @Override public String toString() { return “Account [id=” + id + “, name=” + name + “, money=” + money + &...

MySQL二十三:执行事务实现转账

MySQL二十三:执行事务实现转账...

给ADOQuery增加LoadFromStream,LoadFromString等功能

扩展ADODataSet功能,增加LoadFromStream、SaveToStream、LoadFromString、SaveToString等方法:  ...