zoukankan      html  css  js  c++  java
  • Spring事务管理2--声明式

    简述

    1、Spring 的声明式事务管理在底层是建立在 AOP 的基础上。其本质是在方法前后进行拦截,然后在目标方法开始之前创建一个事务,在执行这目标方法结束后,根据执行情况提交或进行回滚事务。

    2、声明式事务最大的优点就是不需通过编程的方式而进行管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明,便可将事务规则应用到业务逻辑中。

    3、声明式事务不足的地方在于,与编程式事务相比,只能作用到方法级别,无法像编程式事务那样可以作用到代码块级别。

    XML方式

    <!-- 配置事务管理器================= -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        
        <!-- 配置事务的增强 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!-- 配置事务管理的规则,如隔离级别,超时信息,传播行为,是否只读, -->
                <!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
                <tx:method name="update*" propagation="REQUIRED"/>
                <tx:method name="delete*" propagation="REQUIRED"/>
                <tx:method name="find*" read-only="true"/> -->
                <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            </tx:attributes>
        </tx:advice>
        
        <!-- aop的配置=================== -->
        <aop:config>
            <!-- 配置切入点 -->
            <aop:pointcut expression="execution(* zcc.spring_tx.demo2.accountServiceImp1.*(..))" id="pointcut1"/>
            <!-- 配置切入面,以前刚学面向切面编程的时候需要手动编写一个切面类,但是事务spring支持了,不需要自己手动编写-->
            <!-- <aop:aspect ref="">
                <aop:before method=""/>
            </aop:aspect> -->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
            
        </aop:config>

    注解方式

      <!-- 配置事务管理器================= -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        
        <!-- 开启注解事务================= -->
        <tx:annotation-driven transaction-manager="transactionManager"/>

    在业务层上添加注解,注解里面也可以添加属性,比如

    @Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)

    详细代码如下:

    tx2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <!-- 配置Service================ -->
        <bean id="accountService"
            class="zcc.spring_tx.demo2.accountServiceImp1">
            <property name="dao" ref="accountDao"></property>
        </bean>
    
        <!-- 配置Dao===================== -->
        <bean id="accountDao" class="zcc.spring_tx.demo2.accountDaoImp1">
            <!-- <property name="jdbcTemplate" ref="jdbcTemplate"></property> -->
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!-- 配置连接池和jdbc模板 ===================== -->
        <context:property-placeholder
            location="classpath:jdbc.properties" />
    
        <!-- 配置c3p0连接池============ -->
        <bean id="dataSource"
            class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${jdbc.driverClass}"></property>
            <property name="jdbcUrl" value="${jdbc.url}"></property>
            <property name="user" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>
    
        <!-- 配置jdbc模板================ -->
        <!-- <bean id="jdbcTemplate"
            class="org.springframework.jdbc.core.JdbcTemplate">
            ==属性注入==
            <property name="dataSource" ref="dataSource"></property>
        </bean> -->
        
        <!-- 配置事务管理器================= -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        
        <!-- 配置事务的增强 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!-- 配置事务管理的规则 -->
                <!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
                <tx:method name="update*" propagation="REQUIRED"/>
                <tx:method name="delete*" propagation="REQUIRED"/>
                <tx:method name="find*" read-only="true"/> -->
                <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            </tx:attributes>
        </tx:advice>
        
        <!-- aop的配置=================== -->
        <aop:config>
            <!-- 配置切入点 -->
            <aop:pointcut expression="execution(* zcc.spring_tx.demo2.accountServiceImp1.*(..))" id="pointcut1"/>
            <!-- 配置切入面,以前刚学aop的时候需要手动编写一个切面类,但是事务spring支持了,不需要自己手动编写-->
            <!-- <aop:aspect ref="">
                <aop:before method=""/>
            </aop:aspect> -->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
            
        </aop:config>
    </beans>

    tx3.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <!-- 配置Service================ -->
        <bean id="accountService"
            class="zcc.spring_tx.demo3.accountServiceImp1">
            <property name="dao" ref="accountDao"></property>
        </bean>
    
        <!-- 配置Dao===================== -->
        <bean id="accountDao" class="zcc.spring_tx.demo3.accountDaoImp1">
            <!-- <property name="jdbcTemplate" ref="jdbcTemplate"></property> -->
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!-- 配置连接池和jdbc模板 ===================== -->
        <context:property-placeholder
            location="classpath:jdbc.properties" />
    
        <!-- 配置c3p0连接池============ -->
        <bean id="dataSource"
            class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${jdbc.driverClass}"></property>
            <property name="jdbcUrl" value="${jdbc.url}"></property>
            <property name="user" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>
        
        <!-- 配置事务管理器================= -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        
        <!-- 开启注解事务=================== -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    </beans>

    补充:

    重点掌握声明式配置

    xml的,配置事务管理器,<tx:advice>,<tx:attributes>,<tx:method>,<aop:config>,,<aop:pointcut>,<aop:advisor>

    注解方式的:<tx:annotation-driven transaction-manager="transactionManager"/>,在业务层上一定要记得加事务的注解

    最后,看到一篇写的很不错的关于spring事务的博客,在此附上地址,总结的很好:https://blog.csdn.net/trigl/article/details/50968079

  • 相关阅读:
    [转].net自定义验证控件CustomValidator的使用
    After Effects CS4入门经典—高手之路
    [转]用JS获取地址栏参数的方法(超级简单)
    SpringBoot中通过SpringBootServletInitializer如何实现容器初始化
    SpringBoot之二:部署Spring Boot应用程序方式
    Zookeeper学习(八):Zookeeper的数据发布与订阅模式
    Dubbo各种协议详解
    Annotation之四:注解中的-Xlint:unchecked和 -Xlint:deprecation
    mina在spring中的配置多个端口
    Mina2中IoService
  • 原文地址:https://www.cnblogs.com/zengcongcong/p/10412813.html
Copyright © 2011-2022 走看看