zoukankan      html  css  js  c++  java
  • Spring管理事物两种方式

    Spring管理事物两种方式

    1. 编程式事物管理(在开发中不经常使用)

    使用步骤

    1. 配置数据库事物管理 DataSourceTransactionManager
       <!--配置事物管理器-->
        <bean id="transactionManager"
              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    2. 配置数据库事物管理模板
      <!--配置事物管理模板-->
        <bean id="transactionTemplate"
              class="org.springframework.transaction.support.TransactionTemplate">
            <!--配置事物管理-->
            <property name="transactionManager" ref="transactionManager"></property>
    
        </bean>
    3. 在Service层中注入数据库事物管理模板
         <!--配置Service-->
            <bean id="accountService" class="top.wintp.springtx.demo1.service.AccountServiceImpl">
    
                <!--配置事物的管理模板类-->
                <property name="transactionTemplate" ref="transactionTemplate"/>
    
                <property name="accountDao" ref="accountDao"/>
            </bean>
    4. 在需要执行事物的位置调用transactionTemplate的execute()方法
          transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                    @Override
                    protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
    
                        //执行你的逻辑
                    }
            });

    2. 声明式事物管理

    声明式事务管理方式一:基于TransactionProxyFactoryBean的方式 (不常用)

    使用步骤
    1.配置事物管理 DataResourceTransactionManager
         <bean id="transactionManager"
                  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dataSource"/>
            </bean>
    2.配置事物代理类
        <!--配置事务代理类-->
    
              <bean id="accountServiceProxy"
                      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                    <!--配置事务管理器-->
                    <property name="transactionManager" ref="transactionManager"/>
    
                    <!--配置代理目标类-->
                    <property name="target" ref="accountService"></property>
    
                    <!--
                        配置事物的基本属性
                        必须配置
                    -->
    
                    <property name="transactionAttributes">
                        <props>
    
                            <!--
                            prop 格式
                                key:方法名  或者 方法 *  例如  insert*
    
                                值的格式:
                                    PROPAGATION:事物的传播行为
                                    ISOLATION:事物的隔离级别
                                    readOnly:只读
                                    -Exception:发生哪些异常,回滚事物 默认任何异常都回滚
                                    +Exception:发生哪些异常,不回滚事物
                            -->
    
                            <prop key="transfMoney">PROPAGATION_REQUIRED</prop>
    
                        </props>
    
                    </property>
                </bean>
    3.引用代理类 使用代理目标类来接收
            @Resource(name = "accountServiceProxy")
            private AccountService mAccountService;

    声明式事务管理方式二:基于AspectJ的XML方式

    1.配置事物管理类
    <!--配置事物的管理类-->
    
     <bean id="transactionManager"
              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    2.配置事物的增强
      <!--配置事物的增强-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
    
        </tx:advice>

    ###### 3.配置AOP – 切点和切面

       <!--配置AOP-->
         <aop:config>
             <!--配置切入点-->
             <aop:pointcut id="pointcut1"
                           expression="execution(* top.wintp.springtx.demo6.service.AccountService+.*(..))"/>
    
             <!--配置切面-->
             <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
    
         </aop:config>

    声明式事务管理方式三:基于注解的方式

    1.配置事物管理器
      <!--配置事物的管理类-->
        <bean id="transactionManager"
              class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    2.开启事物注解
      <!--开启事物注解
        -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
    3.在需要事物管理的类上添加注解
      @Transactional(propagation = Propagation.REQUIRED)
  • 相关阅读:
    Python DayDayUp系列 —— 字符串操作(一)
    Condition对象以及ArrayBlockingQueue阻塞队列的实现(使用Condition在队满时让生产者线程等待, 在队空时让消费者线程等待)
    ReadWriteLock: 读写锁
    优秀的github项目学习
    synchronized:内部锁
    ReentreantLock:重入锁
    好的文章
    Java内存模型与volatile关键字
    GitHub远程库的搭建以及使用
    使用Executor框架创建线程池
  • 原文地址:https://www.cnblogs.com/shaofeer/p/11154354.html
Copyright © 2011-2022 走看看