银行转账业务-使用事务
2017-08-13 20:25
375 查看
银行转账是是两个账户之间同时进行操作的,一方账户资金减少的同时另外一方的资金就要增加同样的金额。如果一方操作失败那么另外一方的操作就不会成功。也即是需要将这样的两个操作放在一个事务当中。只是这里使用到了层的概念。既然设计到转账那么肯定有一个账户类(DTO数据传输对象),还有一个类是专门用来访问该账户的(DAO数据访问对象)。而我们所需要进行的转账操作则是可以放在服务层进行处理(service)。
当然这里使用了一些工具类,比如连接数据库的类。但是主要的操作是上面的三个类。
DTO(数据传输对象) public class Account { private int id; private String account; private double cash; public Account() { } public Account(String account, double cash) { super(); this.account = account; this.cash = cash; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public double getCash() { return cash; } public void setCash(double cash) { this.cash = cash; } }
DAO(数据访问对象) public class AccountDAO implements BaseDAO<Account> { private Connection conn; public AccountDAO(Connection conn) { this.conn = conn; } @Override public boolean insert(Account t) { return false; } @Override public boolean delete(Account t) { return false; } @Override public boolean update(Account t) { return DAOHelper.execUpdate(conn, "update tbaccount set cash = ? where account = ?", t.getCash(), t.getAccount()); } @Override public Account findById(final Account t) { return DAOHelper.queryOne("select * from tbaccount where id = ?", new CallBack<Account>() { @Override public Account getData(ResultSet rs) { try { if (rs.next()) { t.setAccount(rs.getString("account")); t.setCash(rs.getDouble("cash")); } } catch (SQLException e) { e.printStackTrace(); } return t; } }, t.getId()); } @Override public List<Account> findAll() { return null; } }
service层 public class AccountService extends BaseConn { // 事务 public void transfAccount(Account a, Account b, double money) { Connection conn = getConn(); // 分别查询出A,B账号的个子金额 AccountDAO dao = new AccountDAO(conn); a = dao.findById(a); b = dao.findById(b); if ((a.getAccount() != null) && (b.getAccount() != null)) { // 判断账号a余额是否足够 if (a.getCash() >= money) { // 减少A账号的余额 a.setCash(a.getCash() - money); // 增加B账号的余额 b.setCash(b.getCash() + money); try { // 关闭事务自动提交 conn.setAutoCommit(false); // 开始转账(这里有问题) boolean f1 = dao.update(a); boolean f2 = dao.update(b); if (f1 && f2) { conn.commit(); System.out.println("转账成功!"); } } catch (SQLException e) { try { conn.rollback(); System.out.println("转账失败"); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } } else { System.out.println("余额不足!"); } }else { System.out.println("账号A或者B不存在!"); } } public static void main(String[] args) { Account a = new Account(); Account b = new Account(); a.setId(1); b.setId(3); new AccountService().transfAccount(a, b, 1000); } }
当然这里使用了一些工具类,比如连接数据库的类。但是主要的操作是上面的三个类。
相关文章推荐
- 使用SQL SERVER存储过程实现银行转账业务
- 28Spring_的事务管理_银行转账业务加上事务控制_基于注解进行声明式事务管理
- 使用SQL SERVER存储过程实现银行转账业务
- 使用SQL SERVER存储过程实现银行转账业务
- Spring 事务操作(银行转账案例),使用spring 对jdbc的支持完成对数据库的操作
- 使用事务实现银行转账操作
- 27Spring_的事务管理_银行转账业务加上事务控制_基于tx.aop进行声明式事务管理
- JDBC事务,银行转账,货物进出库等等。
- 从银行转账失败到分布式事务:总结与思考 - 转
- Android 银行转账(事务)
- 通过银行转账业务体会JAVA与存储过程不同实现方式
- Spring中事务管理的四种方法(银行转账为例)
- Spring中使用事务搭建转账环境 转账操作一个账户要减少资金操作一个账户要增加资金操作,如果在两个操作间出现异常转账失败 所以要使用事务
- php+mysqli事务控制实现银行转账实例
- 从银行转账失败到分布式事务:总结与思考
- Spring中使用事务搭建转账环境方法二 相对简便的注解方法 ——配置文件注入对象属性需要setter方法 注解方法,不需要生成setter方法
- 一个MVC架构的线程安全的银行转账案例(事务控制)
- 对企业库的封装,业务层开启事务的解决方案(可直接使用的代码)
- Java基于JDBC实现事务,银行转账及货物进出库功能示例
- 存储过程、事务在银行转账系统的应用