美文网首页
spring事务管理的那些类

spring事务管理的那些类

作者: 6cc89d7ec09f | 来源:发表于2018-11-01 10:02 被阅读10次

spring为了实现事务管理,为不同的dataSource提供不同的transactionManager.
transactionManager的顶层接口是PlatformTransactionManager,抽象层为AbstractPlatformTransactionManager,
为hibernate提供了HibernateTransactionManager,
为jpa提供了JpaTransactionManager,
为jdbc提供的DataSourceTransactionManager

TransactionTemplate类持有了transactionManager,我们可以直接拿TransactionTemplate来实现我们的编程式事务管理.声明式的事务管理也是通过TransactionTemplate来实现的
TransactionTemplate类主要是用来做编程式事务管理的,可以实现代码级别粒度的事务控制,对于声明式事务管理,则不需要用TransactionTemplate,而是用spring官方提供的拦截器TransactionInterceptor,配合BeanNameAutoProxyCreator,可以快速构建出针对方法级别粒度的事务控制.

spring中的事务管理,看这一篇就够了
https://blog.csdn.net/lovesomnus/article/details/52619702

分享下,我再项目中如何使用编程式事务管理的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

<description>数据源及事务配置</description>

    <!-- 数据源配置 -->
    <!-- 代理datasource,使其能够显式获取preparedStatement的参数值 -->
    <bean id="proxyDataSource" class="org.jdbcdslog.ConnectionPoolDataSourceProxy">
        <property name="targetDSDirect" ref="dataSource"/>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="proxyDataSource" />
    </bean>

    <!--事务模板 -->  
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">  
        <property name="transactionManager" ref="transactionManager"/>  
        <!--ISOLATION_DEFAULT 表示由使用的数据库决定  -->  
        <property name="isolationLevelName" value="ISOLATION_DEFAULT"/>  
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />  
        <!-- <property name="timeout" value="30"/> -->  
    </bean> 

<!--配置其他事务传播特性的事务模板-->
    <bean id="transactionTemplateRequireNew"
          class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="iregulationTransactionManager"/>
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
    </bean>
<!--配置摘要日志拦截器-->
    <bean id="dalDigestAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="interceptorNames">
            <list><value>dalDigestLogInterceptor</value></list>
        </property>
        <property name="beanNames">
            <value>*DAO</value>
        </property>
    </bean>

    <bean id="dalDigestLogInterceptor" class="com.iregulation.common.dal.interceptor.DalDigestLogInterceptor" />

   

</beans>

/**
 *  DAL层摘要日志拦截器
 * @author
 * @version $Id: DalDigestLogInterceptor.java, v 0.1 2018年06月01日 12:38 wb-zzy353427 Exp $
 */
public class DalDigestLogInterceptor implements MethodInterceptor {


    /** 摘要日志 */
    private static final Logger DAL_DIGEST_LOGGER = LoggerFactory.getLogger("DAL-DIGEST");

    /** 摘要日志的内容分隔符 */
    private static final String SEP               = ",";

    /** 摘要日志中NULL内容的替代福 */
    private static final String NULL_REPLACE      = "-";

    /** 摘要日志中DO对象的替代福 */
    private static final String DO_REPLACE        = "*";

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // 被拦截的DAO方法
        Method method = invocation.getMethod();

        // 被拦截方法签名:"类名.方法名"
        String invocationSignature = method.getDeclaringClass().getSimpleName() + "."
                + method.getName();

        // DAO执行是否成功
        boolean isSucess = true;

        long startTime = System.currentTimeMillis();

        try {
            return invocation.proceed();
        } catch (Exception e) {

            isSucess = false;
            throw e;

        } finally {
            try {
                long elapseTime = System.currentTimeMillis() - startTime;

                LoggerUtil.info(
                        DAL_DIGEST_LOGGER,
                        buildDigestLog(invocationSignature, isSucess, elapseTime,
                                invocation.getArguments()));

            } catch (Exception e) {
                LoggerUtil.error(e, "记录dal摘要日志出错");
            }

        }
    }

    /**
     *
     * @param invocationSignature 方法签名
     * @param isSucess  执行是否成功
     * @param elapseTime    耗时
     * @param arguments     起始时间
     * @return
     */
    private Object buildDigestLog(String invocationSignature, boolean isSucess, long elapseTime,
                                  Object[] arguments) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        {
            //打印主体信息
            sb.append("(");

            // 调用方法签名:"系统名.方法名"
            sb.append(invocationSignature).append(SEP);
            // 方法执行是否成功
            sb.append(isSucess ? "Y" : "N").append(SEP);
            // 方法耗时
            sb.append(elapseTime).append("ms");

            sb.append(")");
        }

        if (arguments != null) {
            // 打印参数信息
            sb.append("(");

            for (Object arg : arguments) {

                if (arg == null) {
                    arg = NULL_REPLACE;
                }

                if (StringUtil.contains(arg.getClass().getSimpleName(), "DO")) {
                    arg = DO_REPLACE;
                }

                sb.append(arg).append(SEP);
            }

            if (arguments.length > 0) {
                sb.deleteCharAt(sb.length() - 1);
            }

            sb.append(")");
        }

        sb.append("]");

        return sb.toString();
    }
}

TransactionTemplate的使用方法,可以参考,<设计模式>中的模板方法模式: https://www.jianshu.com/p/7e6b227ccae3

相关文章

  • spring事务管理的那些类

    spring为了实现事务管理,为不同的dataSource提供不同的transactionManager.tran...

  • Spring 事务实现

    一、Spring两类事务管理 1、编程式事务管理 1.1、获取事务管理对象 1.2、获取事务定义 1.3、设置事务...

  • Spring中的AOP事务

    【目录】1 Spring的事务管理机制2 Spring事务管理两种方式 1 Spring的事务管理机制 Sprin...

  • Spring事务管理只对出现运行期异常进行回滚

    使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文...

  • spring之事务管理

    spring事务管理是通过aop来实现的 1.配置事务管理类,即切面类 2.配置事务通知,即增强 3.配置增强加切...

  • 说说在 Spring 中,如何编程实现事务管理

    Spring 为编程式的事务管理,提供了相应的模板类 org.springframework.transacti...

  • spring事务

    1、spring事务管理器PlatformTransactionManager 1.1、没有spring事务管理器...

  • Spring之事务管理

    Spring事务管理(详解+实例)Spring详解(八)------事务管理 一. 概念 事务(Transacti...

  • Spring-事务机制

    一、Spring事务 事务管理概述 Spring事务管理分为编程式事务管理和声明式事务管理两种 编程式事务:允许用...

  • 19、Spring-事务机制-使用

    一、简介 Spring事务管理分为编程式事务管理和声明式事务管理两种, 声明式事务管理:底层是建立在Spring ...

网友评论

      本文标题:spring事务管理的那些类

      本文链接:https://www.haomeiwen.com/subject/bitztqtx.html