zoukankan      html  css  js  c++  java
  • 模板方法在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;
        }
    

    看完了应该明白了模板方法在它里面的应用了吧。

  • 相关阅读:
    Jmeter_远程启动 I
    jmeter(九)逻辑控制器
    Mysql innodb 间隙锁 (转)
    MySQL- InnoDB锁机制
    Innodb间隙锁,细节讲解(转)
    性能测试:压测中TPS上不去的几种原因分析(就是思路要说清楚)
    Redis性能调优
    Redis基础
    VMThread占CPU高基本上是JVM在频繁GC导致,原因基本上是冰法下短时间内创建了大量对象堆积造成频繁GC。
    关于Hibernate二级缓存第三方插件EHCache缓存
  • 原文地址:https://www.cnblogs.com/soundcode/p/6478512.html
Copyright © 2011-2022 走看看