spring 事务介绍与源码分析

2021-02-19  本文已影响0人  逗逗罗
事务
事务(Transaction)是数据库区别于文件系统的重要特性之一。MySQL 事务主要用于处理操作量大,复杂度高的数据。
1. 在 MySQL 数据库中只有 Innodb 数据库引擎的数据库或表才支持事务;
2. 事务是一个最小的不可再分的工作单元,可以用来保持数据库的完整性,保证成批的 DML(insert, update, delete) 语句, 要么全执行要么全不执行
spring事务
        - TransactionStatus:事务具体运行状态
            ![images](https://img.haomeiwen.com/i8024044/8972551d870e7572?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


        - TransactionDefinition:事务定义信息(隔离,传播,超时,只读)
            ![images](https://img.haomeiwen.com/i8024044/dfc40fe836faaa82?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

+ 声明式事务
    - TransactionProxyFactoryBean
        为每个需要事务支持的 Bean 创建代理类
        ```java
        @Bean(name = "daoProxy")
        public TransactionProxyFactoryBean daoTemplate(DeclareDaoService declareDaoService) {
            TransactionProxyFactoryBean transactionProxyFactoryBean = new TransactionProxyFactoryBean();
            transactionProxyFactoryBean.setTransactionManager(transactionManager());
            transactionProxyFactoryBean.setTarget(declareDaoService);
            Properties properties = new Properties();
            properties.setProperty("*", "PROPAGATION_REQUIRED");
            transactionProxyFactoryBean.setTransactionAttributes(properties);
            return transactionProxyFactoryBean;
        }
        ```

    - TransactionInterceptor
        ```java
        @Bean("transactionInterceptor")
        public TransactionInterceptor transactionInterceptor() {
            TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
            transactionInterceptor.setTransactionManager(transactionManager());
            Properties properties = new Properties();
            properties.setProperty("*", "PROPAGATION_REQUIRED");
            transactionInterceptor.setTransactionAttributes(properties);
            return transactionInterceptor;
        }

        @Bean
        public BeanNameAutoProxyCreator beanNameAutoProxyCreator(){
            BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
            beanNameAutoProxyCreator.setBeanNames("*Service");
            beanNameAutoProxyCreator.setInterceptorNames("transactionInterceptor");
            return beanNameAutoProxyCreator;
        }
        ```

    - xml 配置文件 tx:advice 
        ```xml
        <!-- 定义事务管理器(声明式的事务) -->  
        <bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>

        <!-- 
            通过对源码的分析 tx 标签的解析流程:
            XmlBeanDefinitionReader
                DefaultBeanDefinitionDocumentReader
                    DefaultNamespaceHandlerResolver(META-INF/spring.handlers)
                        TxNamespaceHandler
                            TxAdviceBeanDefinitionParser
                            AnnotationDrivenBeanDefinitionParser
                            JtaTransactionManagerBeanDefinitionParser
            TxAdviceBeanDefinitionParser -> 最终注册的 BeanDefinition 为 TransactionInterceptor              
        -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="*" propagation="REQUIRED" />
            </tx:attributes>
        </tx:advice>
        
        <aop:config>
            <aop:pointcut id="interceptorPointCuts"
                expression="execution(* *..*(..))" />
            <aop:advisor advice-ref="txAdvice"
                pointcut-ref="interceptorPointCuts" />        
        </aop:config> 
        ```

    - 注解的方式
        ```java
        @EnableTransactionManagement
        public class TxConfig {
        }

        @Service
        @Transactional
        public class DeclareCglibDaoService {
        }

        ```
上一篇 下一篇

猜你喜欢

热点阅读