一. 前言:
在上一篇博文中, 我们使用TransactionManager和ThreadLocal完成线程安全的事务管理,不知大家有没有发现,AccountService代码充斥着很多事务处理的代码,其实这些代码在很多方法里面都是重复出现,我们可以使用Template模式进行优化。
二. 实现:
1. 写一个模板类:TransactionTemplate
/** * 模板类 */ public abstract class TransactionTemplate { public void doJobInTransaction() throws SQLException { try { // 开启事务 TransactionManager.beginTransaction(); // 执行业务方法 this.doJob(); // 提交事务 TransactionManager.commit(); } catch (Exception e) { // 出错了, 回滚事务 TransactionManager.rollback(); } finally { // 关闭连接 TransactionManager.close(); } } protected abstract void doJob() throws Exception; }
在TransactionTemplate类中定义一个doJobInTransaction方法,在该方法中首先使用TransactionManager开始事务,
然后调用doJob方法完成业务功能,doJob方法为抽象方法,完成业务功能的子类应该实现该方法,
最后,根据doJob方法执行是否成功决定commit事务或是rollback事务。
2. 改造业务处理类AccountService
/** * 业务逻辑层 */ public class AccountService { public void transfer(final Account out, final Account in, final int money) throws SQLException { new TransactionTemplate() { @Override protected void doJob() throws Exception { // 查询两个账户 AccountDAO accountDAO = new AccountDAO(); Account outAccount = accountDAO.findAccountById(out.getId()); Account inAccount = accountDAO.findAccountById(in.getId()); // 转账 - 修改原账户金额 outAccount.setMoney(outAccount.getMoney() - money); inAccount.setMoney(inAccount.getMoney() + money); // 更新账户金额 accountDAO.update(outAccount); accountDAO.update(inAccount); } }.doJobInTransaction(); } }
在AccountService的transfer方法中,我们创建了一个匿名的TtransactionTemplate类,并且实现了doJob方法(doJob方法中两次调用DAO完成业务操作),然后调用调用TransactionTemplate的doJobInTransaction方法。
doJobInTransaction内部帮我们调用doJob并实现事务控制
时间: 2024-10-09 21:58:06