模板方法在Spring事务中的应用

事务对于我们来讲不并陌生,也是在实际应用中一直都在使用。在JDBC中,事务大致的使用结构如下:

开启事务

业务逻辑处理

提交事务

Spring只是对事务进行了扩展和封装使用,现在看看在内部它是如何工作的。

1. PlatformTransactionManager
PlatformTransactionManager是一个接口,它定义的方法如下:
 // 获取事务
   TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
   // 提交事务
   void commit(TransactionStatus status) throws TransactionException;
   // 回滚事务
   void rollback(TransactionStatus status) throws TransactionException;
看到这个类的定义,基本上对事务的功能有一个初步的掌握,完全就是平时写事务步骤的关键方法啊!

2. AbstractPlatformTransactionManager
AbstractPlatformTransactionManager它实现了PlatformTransactionManager接口。但是这个抽象类只是定义了一个骨架,抽象出
doBegin(),doCommit(),doRollback()这三个抽象方法让子类去实现。

3. DataSourceTransactionManager
DataSourceTransactionManager是JDBC事务的实现类,它继承了AbstractPlatformTransactionManager类,并实现了doBegin(),doCommit(),doRollback()这三个关键的方法。

DataSourceTransactionManager有一个成员是DataSource,在事务配置时,要传这个属性过去。

doBegin() 中有一个关键的代码:con.setAutoCommit(false);
doCommit() 中有一个关键的代码:con.commit();
doRollback() 中有一个关键的代码:con.rollback();
看到这里,有没有很熟悉的感觉呢?!

4. TransactionTemplate
TransactionTemplate是手动事务编程的模板类,它是如何来完成的呢?它有一个重要的方法:execute()方法,它里面定义了事务操作的基本骨架,剔除一些异常处理的代码,看看最关键的代码并作注释。

public <T> T execute(TransactionCallback<T> action) throws TransactionException {
            // 这里主要调用了doBegin()方法
            TransactionStatus status = this.transactionManager.getTransaction(this);
            T result;
            try {
                // 回调子类中的具体实现逻辑,处理业务逻辑
                result = action.doInTransaction(status);
            }catch(Exception e){
                // 调用doRollback()方法
                rollbackOnException(status, ex);
            }
            // 调用doCommit()方法
            this.transactionManager.commit(status);
            return result;
    }
看完了应该明白了模板方法在它里面的应用了吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值