• Java事务处理全解析(五)—— Template模式


    在本系列的上一篇文章中,我们讲到了使用TransactionManger和ConnectionHolder完成线程安全的事务管理,在本篇中,我们将在此基础上引入Template模式进行事务管理。

     

    Template模式大家应该都很熟悉,比如Spring就提供了许多Template,像JdbcTemplate和JmsTemplate等。Template模式的基本思想是:在超类里将完成核心功能的方法声明为抽象方法,留给子类去实现,而在超类中完成一些通用操作,比如JMS的Session的建立和数据库事务的准备工作等。

    在本篇文章中,我们使用一个Template类来帮助管理事务,定义TransactionTemplate类如下:

    复制代码
    package davenkin.step4_transaction_template;
    
    import davenkin.step3_connection_holder.TransactionManager;
    import javax.sql.DataSource;
    
    public abstract class TransactionTemplate
    {
        private TransactionManager transactionManager;
    
        protected TransactionTemplate(DataSource dataSource)
        {
            transactionManager = new TransactionManager(dataSource);
        }
    
        public void doJobInTransaction()
        {
            try
            {
                transactionManager.start();
                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事务。

    然后定义使用TransactionTemplate的TransactionTemplateBankService:

    复制代码
    package davenkin.step4_transaction_template;
    
    import davenkin.BankService;
    import davenkin.step3_connection_holder.ConnectionHolderBankDao;
    import davenkin.step3_connection_holder.ConnectionHolderInsuranceDao;
    import javax.sql.DataSource;
    
    public class TransactionTemplateBankService implements BankService
    {
        private DataSource dataSource;
        private ConnectionHolderBankDao connectionHolderBankDao;
        private ConnectionHolderInsuranceDao connectionHolderInsuranceDao;
    
        public TransactionTemplateBankService(DataSource dataSource)
        {
            this.dataSource = dataSource;
            connectionHolderBankDao = new ConnectionHolderBankDao(dataSource);
            connectionHolderInsuranceDao = new ConnectionHolderInsuranceDao(dataSource);
        }
    
        public void transfer(final int fromId, final int toId, final int amount)
        {
            new TransactionTemplate(dataSource)
            {
                @Override
                protected void doJob() throws Exception
                {
                    connectionHolderBankDao.withdraw(fromId, amount);
                    connectionHolderInsuranceDao.deposit(toId, amount);
                }
            }.doJobInTransaction();
        }
    }
    复制代码

    在TransactionTemplateBankService的transfer方法中,我们创建了一个匿名的TtransactionTemplate类,并且实现了doJob方法,在doJob方法中调用两个DAO完成业务操作,然后调用调用TransactionTemplateBankService的doJobInTransaction方法。

    由于TransactionTemplate只是对上一篇文章中事务处理的一层封装,故TransactionManager和两个DAO类都保持和上一篇中的一样,此时他们都使用SingleThreadConnectionHolder获得Connection,故事务处理成功。

    在下一篇文章中,我们会讲到使用Java的动态代理来完成事务处理,这也是Spring管理事务的典型方法。

  • 相关阅读:
    Zoj 2913 Bus Pass BFS
    Poj 1324 Holedox Moving 状压判重+BFS
    Poj 1465 Multiple BFS+余数判重
    HDU 1010 Tempter of the Bone dfs+剪枝
    Poj 1659 Frogs' Neighborhood 图的可图性判断
    ZOJ 3203 Light Bulb 三分
    HDU 1698 Just a Hook(线段树的区间修改)
    HDU 1698 Just a Hook(线段树的区间修改)
    Codeforces 1261B2 Optimal Subsequences (Hard Version)(树状数组)
    Codeforces 1261B2 Optimal Subsequences (Hard Version)(树状数组)
  • 原文地址:https://www.cnblogs.com/fengjian/p/4209664.html
Copyright © 2020-2023  润新知