配置spring 事务

一、准备工作:
    模拟买书的场景:
        1.输入书名买书
        2.账户余额减五
        3.书库数量减少一
    当书库数量不足时,如果不存在事务的话,则书库数量不变,但账户余额却减少了

二、配置声明式事务(注解的方式)
    在application.xml中配置:

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 启动事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
三、在编写买书方法:
    /**
     * 事务的传播行为:一个事务方法被另一个事务方法调用,
     * 被调用的事务方法如何工作在事务中
     * 使用propagation 指定事务的传播行为,即当前的事务被另一个事务方法调用时
     */
    @Transactional(propagation=Propagation.REQUIRED)
    @Override
    public void buy(String name) {
        System.out.println("购书开始");
        int money = Integer.parseInt(selectCount(name))-5;
        if(money <0){
            throw new MyException("账户余额不足");
        }
        //更新账户余额
        updateCount(name);
        int num = Integer.parseInt(selectBookNum(name))-1;
        if(num <0){
            throw new MyException("库存不足");
        }
        //更新书库数量
        updateBook(name);
        System.out.println("购书完成");
    }

    MyException 为自定义的异常集成RuntimeException,
    因为spring声明式事务对运行时异常支持事务的回滚

四:事务的传播行为:
     事务的7种传播行为: 默认为REQUIRED
     PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
     PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
     PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
     PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
     PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
     PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
     PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,
     则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
    
五、编写买多本书的方法
    /**
     * 买多本书
     */
    @Transactional
    @Override
    public void buyButch(String name, int num) {
        for(int i=0;i<num;i++){
            //调用买单本书的方法
            testService.buy(name);
        }    
    }    
    
    当将buy 方法的事务注解改为:
    @Transactional(propagation=Propagation.REQUIRED_NEW) 时,
    买多本书的时候,当库存不足的时候之前的不回滚
    @Transactional(propagation=Propagation.REQUIRED) 时,
    买多本书的时候,当库存不足的时候之前的回滚

六:事务的隔离级别: 事务并发的时候,可能存在脏读,幻读,不可重复读
Isolation 属性一共支持五种事务设置,具体介绍如下:

使用isolation 来指定事务的隔离级别
常用:READ_COMMITTED 读与提交

DEFAULT 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .
READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
READ_COMMITTED  会出现不可重复读、幻读问题(锁定正在读取的行)
REPEATABLE_READ 会出幻读(锁定所读取的所有行)
SERIALIZABLE 保证所有的情况不会发生(锁表)

七、异常回滚
    默认情况下spring 的声明式事务对所有的运行时异常进行回滚,也可以通过对已的属性进行设置
     noRollbackFor 对异常别回滚了
    @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED
         ,noRollbackFor={MyException.class},readOnly=false,timeout=3)

    rollbackFor 可以指定异常进行回滚

    readOnly=false 设置只读属性,表示这个事务只读取数据,但不能更新数据
    这样可以帮助数据库优化引擎,若真的是一个只读数据库值的方法,应设置readOnly = true

    timeout 指定强制回滚之前,事务可以占用的时间,防止事务对数据库链接占用时间过长

八、基于XML文件的形式配置事务
    修改XML文件:
    <!-- 基于XML的形式配置事务 -->
    <!-- 1.配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 2.配置事务属性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 针对某名称的方法,配置传播行为属性-->
            <tx:method name="buy" propagation="REQUIRES_NEW"></tx:method>
            <!-- 针对所有的方法 -->
            <tx:method name="*"></tx:method>
            <!-- 针对get方法开头的为只读 -->
            <tx:method name="get*" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>
    <!-- 3.配置事务切点 ,以及把事务切入点及事务属性关联起来: 作用在哪些类的哪些方法上-->
    <aop:config>
        <aop:pointcut expression="execution(* service.impl.*.*(..))" id="txPointCut"></aop:pointcut>
        <!-- 切点和事务关联 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"></aop:advisor>
    </aop:config>

基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值