美文网首页
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事务管理的那些类

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