事务管理的作用及使用

1、 为何要用到声明事务管理 
如果一个service方法有两个dao层方法  如果第一个dao方法能通过,第二个dao方法不能通过
则在结果中并不能得到我们想要的结果  例如转账 :两个动作 给自己扣钱   给对方价钱  如果扣钱动作完成
请对方却没加到钱  则会产生错误,因此我们要引入  “声明事务管理”

*****************************
事务管理是针对于数据库的
*****************************

2、6.2XML配置方式添加事务管理(tx、aop元素)

【操作思路】:
1、    确定目标:需要对AccountService 的 transfer方法,配置切入点
2、    需要Advice (环绕通知),方法前开启事务,方法后提交关闭事务 
3、    配置切面和切入点

    步骤1、
      导入aop相关的包(4个),引入约束名称空间(aop和tx 的名称空间)
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:p="http://www.springframework.org/schema/p"
               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

    步骤2、 配置spring容器,applicationContext.xml文件
        !-- 第一步:定义具体的平台事务管理器(DataSource事务管理器) -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据源   和数据库关联上-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
        <!-- 第二步:定义通知,通知中要处理的就是事务 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 配置事务的属性定义 -->
        <tx:attributes>
            <!-- 配置具体的方法的事务属性
            isolation//事务的隔离级别,默认是按数据库的隔离级别来
            propagation//事务的传播行为,默认是同一个事务
            timeout="-1":事务的超时时间,默认值使用数据库的超时时间。
            read-only="false":事务是否只读,默认可读写。
            rollback-for:遇到哪些异常就回滚,其他的都不回滚
            no-rollback-for:遇到哪些异常不回滚,其他的都回滚。和上面互斥的
             -->
            <tx:method name="transfer" isolation="DEFAULT"    propagation="REQUIRED" timeout="-1" read-only="false"/>
            
            <!-- 支持通配符
                要求service中 方法名字必须符合下面的规则
             -->
            <tx:method name="save*"/>
            <tx:method name="update*"/>
            <tx:method name="delete*"/>
            <tx:method name="find*" read-only="true"/>
        </tx:attributes>
        </tx:advice>
        <!-- 第三步:配置切入点,让通知关联切入点,即事务控制业务层的方法 -->
        <aop:config>
            <!-- 切入点 -->
            <aop:pointcut expression="bean(*Service)" id="txPointcut"/>
            <!-- 切面 -->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
        </aop:config>
    
            <!-- dao -->
            <bean id="accountDao" class="com.igeek.dao.AccountDaoImpl">
            <!-- 注入数据源,才拥有jdbctemplate -->
            <property name="dataSource" ref="dataSource"/>
            </bean>
            <!-- 业务层 -->
            <bean id="accountService" class="com.igeek.service.AccountServiceImpl">
            <!-- 注入dao -->
            <property name="accountDao" ref="accountDao"/>
            </bean>
    
        </beans>

 -----------------------------------------------------------------------------------------------------
注解配合方式添加事务管理 @Transactional 
    
    1   、确定目标( bean 的方法)                  
    在service层添加
    //@Transactional/会对该类中,所有的共有的方法,自动加上事务--全局的设置,默认是可写
    //@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=false)
    @Transactional                 //缺省值即为上面的值
    
    有些方法需要改变事务  如查询  设置为只读  所以在fundAccount()方法上设置
        @Transactional(readOnly=true)//使用局部覆盖全局的

    2、创建.XML文件配置

        1、<!-- 第一步  定义具体的平台事务管理器(DataSource事务管理器) -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据源   别人提供的对象你无法使用注解  所以只能用XML形式进行关联 -->
        <property name="dataSource" ref="dataSource"/>
        </bean>
    
         2、<!-- 第二步开始事务注解开发     配置事务注解驱动 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>

おすすめ

転載: blog.csdn.net/qq_36737214/article/details/82467211