springboot事务的使用与简单的应用场景

使用介绍

下面的场景是基于springboot 自动配置的 DataSourceTransactionManager,我们仅在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了。下面回顾一些基础的熟悉介绍(根据个人情况选择性忽略)。

  • 事务的传播行为:
行为 含义
Propagation.REQUIRED(默认值) 如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务
Propagation.SUPPORTS 如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行
Propagation.MANDATORY 如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常
Propagation.REQUIRES_NEW 重新创建一个新的事务,如果当前存在事务,暂停当前的事务
Propagation.NOT_SUPPORTED 以非事务的方式运行,如果当前存在事务,暂停当前的事务
Propagation.NEVER 以非事务的方式运行,如果当前存在事务,则抛出异常
Propagation.NESTED 和 Propagation.REQUIRED 效果一样
  • 隔离级别属性:
    事务的隔离级别,默认值为 Isolation.DEFAULT,可选有Isolation.READ_UNCOMMITTEDIsolation.READ_COMMITTEDIsolation.REPEATABLE_READIsolation.SERIALIZABLE
  • rollbackFor属性:指定能够触发事务回滚的异常类型,可以指定多个异常类型。
  • noRollbackFor属性:抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。
  • readOnly属性:指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
  • timeOut属性:事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。

场景介绍

模拟场景为用户在拼夕夕买辣条,先扣款,扣款成功再减库存。这里使用buy、stockUpdate两个方法模拟业务。

  • 数据库表
CREATE TABLE `a_account` (
  `userid` int(11) NOT NULL COMMENT '账户ID',
  `account` int(11) DEFAULT NULL COMMENT '账户余额',
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='个人账户余额表';

CREATE TABLE `a_stocks` (
  `goods` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品名称',
  `stocks` int(11) DEFAULT NULL COMMENT '库存数量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='库存表';

初始余额10000元,辣条600包
初始账户余额10000元
辣条600包

  • StocksMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ncs.rq.analysis.mapper.StocksMapper">

    <update id="updateStock">
        update a_stocks set stocks=stocks-1 WHERE goods = '辣条'
    </update>
</mapper>
  • AccountMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ncs.rq.analysis.mapper.AccountMapper">

    <update id="updateAccount">
        update a_account set account=account-100 where userid = 1762366
    </update>
</mapper>

保证扣款成功且库存更新成功,失败一项则回滚

  • 代码
    AccountServiceImpl类
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot提供了强大的事务管理功能,适用于各种场景。以下是几个常见的使用场景: 1. 数据库操作:在使用Spring Boot进行数据库操作时,可以使用事务来确保一组相关的数据库操作要么全部成功执行,要么全部回滚到原始状态。例如,在插入、更新或删除多个相关表的数据时,可以将这些操作放在一个事务中,以确保数据的一致性。 2. 多个数据源:如果应用程序需要同时连接多个数据库或数据源,可以使用事务管理来保证不同数据源之间的一致性。例如,在一个应用程序中同时连接MySQL和Oracle数据库,可以通过使用事务管理来确保操作这两个数据库的数据时的一致性。 3. 业务逻辑处理:在复杂的业务逻辑处理中,可能需要多个步骤的操作,并且这些操作要么全部成功,要么全部回滚。使用事务可以确保在一组相关的操作中,如果任何一个操作失败,所有已经执行的操作都将被撤销。这在保持数据完整性和一致性方面非常有用。 4. 并发操作:在并发环境下,多个线程或请求可能同时访问和修改相同的数据。使用事务可以提供隔离性,确保并发操作之间的数据一致性。例如,在购买商品的应用中,多个用户可能同时尝试购买同一件商品,使用事务可以避免出现超卖或库存错误的情况。 5. 异常处理:在处理异常时,事务管理可以确保在异常发生时回滚操作,以防止数据的不一致性。例如,在处理用户注册时,如果发生了一些验证错误或其他异常,可以使用事务管理来回滚已经执行的操作,以保持数据库的一致性。 总之,Spring Boot事务管理功能非常灵活,适用于各种场景。通过使用事务管理,可以确保数据的完整性和一致性,并提供并发控制和异常处理的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值