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

来源:互联网 发布:java soap xml 编辑:程序博客网 时间:2024/05/19 03:17

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

 

这是一个关于Java事务处理的系列文章,请通过以下方式下载github源代码:

Git clone https://github.com/davenkin/java_transaction_workshop.git

 

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

 

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

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public abstract class TransactionTemplate  
  2. {  
  3.     private TransactionManager transactionManager;  
  4.        
  5.     protected TransactionTemplate(DataSource dataSource)  
  6.     {  
  7.         transactionManager = new TransactionManager(dataSource);  
  8.     }  
  9.        
  10.     public void doJobInTransaction()  
  11.     {  
  12.         try  
  13.         {  
  14.             transactionManager.start();  
  15.             doJob();  
  16.             transactionManager.commit();  
  17.         } catch (Exception e)  
  18.         {  
  19.             transactionManager.rollback();  
  20.         } finally  
  21.         {  
  22.             transactionManager.close();  
  23.         }  
  24.     }  
  25.        
  26.     protected abstract void doJob() throws Exception;  
  27. }  

在TransactionTemplate类中定义一个doJobInTransaction方法,在该方法中首先使用TransactionManager开始事务,然后调用doJob方法完成业务功能,doJob方法为抽象方法,完成业务功能的子类应该实现该方法,最后,根据doJob方法执行是否成功决定commit事务或是rollback事务。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class TransactionTemplateBankService implements BankService  
  2. {  
  3.     private DataSource dataSource;  
  4.     private ConnectionHolderBankDao connectionHolderBankDao;  
  5.     private ConnectionHolderInsuranceDao connectionHolderInsuranceDao;  
  6.       
  7.     public TransactionTemplateBankService(DataSource dataSource)  
  8.     {  
  9.         this.dataSource = dataSource;  
  10.         connectionHolderBankDao = new ConnectionHolderBankDao(dataSource);  
  11.         connectionHolderInsuranceDao = new ConnectionHolderInsuranceDao(dataSource);  
  12.     }  
  13.       
  14.     public void transfer(final int fromId, final int toId, final int amount)  
  15.     {  
  16.         new TransactionTemplate(dataSource)  
  17.         {  
  18.             @Override  
  19.             protected void doJob() throws Exception  
  20.             {  
  21.                 connectionHolderBankDao.withdraw(fromId, amount);  
  22.                 connectionHolderInsuranceDao.deposit(toId, amount);  
  23.             }  
  24.         }.doJobInTransaction();  
  25.     }  
  26. }  

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

 

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

0 0