设为首页 加入收藏

TOP

15、Spring之基于xml的声明式事务(三)
2023-09-09 10:25:55 】 浏览:79
Tags:Spring xml 明式事
controller; import org.rain.spring.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; /** * @author liaojy * @date 2023/9/3 - 17:54 */ @Controller public class BookController { @Autowired private BookService bookService; public void buyBook(Integer bookId, Integer userId){ bookService.buyBook(bookId,userId); } }

15.1.7、配置对注解组件的扫描

image

    <!--扫描注解组件-->
    <context:component-scan base-package="org.rain.spring"></context:component-scan>

15.2、基于xml事务的实现

15.2.1、配置事务管理器

image

<!--配置事务管理器-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 装配要进行事务管理的数据源 -->
        <property name="dataSource" ref="datasource"></property>
    </bean>

15.2.2、配置事务通知

image

注意:tx:advice标签导入的名称空间需要 tx 结尾的那个

    <!--
        tx:advice标签:配置事务通知
            id属性:给事务通知标签设置唯一标识,便于引用
            transaction-manager属性:通过id引用对应的事务管理器
    -->
    <tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager"></tx:advice>

15.2.3、配置事务通知作用到连接点

image

    <aop:config>
        <!--
            通过切入点表达式,将事务通知作用到连接点
        -->
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* org.rain.spring.service.impl.*.*(..))"></aop:advisor>
    </aop:config>

15.2.4、配置事务通知的属性

image

注意:不使用tx:method标签指定的方法是不会使用事务的,为了让切入点表达式的所有方法都使用到事务,可以使用*通配符:
<tx:method name="*"/>

        <tx:attributes>
            <!--
                tx:method标签:配置使用事务的方法
                    name属性:指定用事务的方法名,可以使用星号代表多个字符
            -->
            <tx:method name="buyBook"/>
        </tx:attributes>

15.3、测试事务的效果

15.3.1、创建测试类

模拟场景:

  • 用户购买图书,先查询图书的价格,再更新图书的库存和用户的余额

  • 假设id为1的用户(余额为50),购买id为1的图书(价格为80)

  • 购买图书之后,用户的余额应为-30;但由于数据库中余额字段设置了无符号,因此无法将-30插入到余额字段;
    此时执行更新用户余额的sql语句会抛出异常

image

package org.rain.spring.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.rain.spring.controller.BookController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author liaojy
 * @date 2023/9/4 - 0:20
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-tx-xml.xml")
public class TxByXml {

    @Autowired
    private BookController bookController;

    @Test
    public void testBuyBook(){
        bookController.buyBook(1,1);
    }

}

15.3.2、执行前的数据

image

此时id为1的图书库存为100

image

此时id为1的用户余额为50

15.3.3、执行时的异常

image

15.3.3、执行后的数据

image

由于使用了Spring的声明式事务,更新(图书)库存和更新(用户)余额,要么都成功,要么都失败;

本例属于都失败,所以(图书)库存和(用户)余额都没有变化

image

15.4、配置事务的属性

image

事务属性的详细作用,请参考14.5节

 <!-- rollback-for属性:设置回滚的异常 -->
 <!-- no-rollback-for属性:设置不回滚的异常 -->
 <!-- isolation属性:设置事务的隔离级别 -->
 <!-- timeout属性:设置事务的超时属性 -->
 <!-- propagation属性:设置事务的传播行为 -->
 <tx:method name="save*" read-only="false" rollback-for="java.lang.Exception" propagation="REQUIRES_NEW"/>
 <tx:method name="update*" read-only="false" rol
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇电商类面试问题--01Elasticsearch.. 下一篇测试大姐提了个bug,为什么你多了..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目