iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作
  • 392
分享到

SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作

2023-06-02 12:06:04 392人浏览 独家记忆
摘要

本文源码:GitHub·点这里 || gitEE·点这里一、事务管理简介事务基本概念一组业务操作ABCD,要么全部成功,要么全部不成功。特性:ACID原子性:整体一致性:完成隔离性:并发持久性:结果隔离问题脏读:一个事务读到另一个事务没有

本文源码GitHub·点这里 || gitEE·点这里

一、事务管理简介

事务基本概念
一组业务操作ABCD,要么全部成功,要么全部不成功。

特性:ACID
原子性:整体
一致性:完成
隔离性:并发
持久性:结果

隔离问题
脏读:一个事务读到另一个事务没有提交的数据
不可重复读:一个事务读到另一个事务已提交的数据(update)
虚读(幻读):一个事务读到另一个事务已提交的数据(insert)

隔离级别
read uncommitted:读未提交。
read committed:读已提交。解决脏读。
repeatable read:可重复读。解决:脏读、不可重复读。
serializable :串行化。都解决,单事务。

二、spring管理事务

1、顶级接口

SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作

1)PlatfORMTransactionManager
平台事务管理器,spring要管理事务,必须使用事务管理器进行事务配置时,必须配置事务管理器。
2)TransactionDefinition
事务详情(事务定义、事务属性),spring用于确定事务具体详情,
例如:隔离级别、是否只读、超时时间 等
进行事务配置时,必须配置详情。spring将配置项封装到该对象实例。
3)TransactionStatus
事务状态,spring用于记录当前事务运行状态。例如:是否有保存点,事务是否完成。
spring底层根据状态进行相应操作。

2、事务状态

SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作

3、事务定义

SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作

PROPAGATION_REQUIRED , required , 必须  【默认值】    支持当前事务,A如果有事务,B将使用该事务。    如果A没有事务,B将创建一个新的事务。PROPAGATION_SUPPORTS ,supports ,支持    支持当前事务,A如果有事务,B将使用该事务。    如果A没有事务,B将以非事务执行。PROPAGATION_MANDATORY,mandatory ,强制    支持当前事务,A如果有事务,B将使用该事务。    如果A没有事务,B将抛异常。PROPAGATION_REQUIRES_NEW , requires_new ,必须新的    如果A有事务,将A的事务挂起,B创建一个新的事务    如果A没有事务,B创建一个新的事务PROPAGATION_NOT_SUPPORTED ,not_supported ,不支持    如果A有事务,将A的事务挂起,B将以非事务执行    如果A没有事务,B将以非事务执行PROPAGATION_NEVER ,never,从不    如果A有事务,B将抛异常    如果A没有事务,B将以非事务执行PROPAGATION_NESTED ,nested ,嵌套    A和B底层采用保存点机制,形成嵌套事务。掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED

三、SpringBoot2 管理事务

基于转账的案例演示,基于druid连接池配置。druid连接池在文章。

SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面

1、新建转账表

CREATE TABLE account(  id INT PRIMARY KEY AUTO_INCREMENT,  username VARCHAR(50),  money INT)ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO account(username,money) VALUES('jack','10000');INSERT INTO account(username,money) VALUES('rose','10000');SELECT * FROM account;

2、基于事务手动管理器

该配置用于测试事务的手动管理。

@Bean(name = "transactionManager")public PlatformTransactionManager transactionManager (DruidDataSource dataSource){    LOGGER.info("【transactionManager 初始化...】");    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();    transactionManager.setDataSource(dataSource);    return transactionManager;}@Bean(name = "transactionTemplate")public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager)    LOGGER.info("【transactionTemplate 初始化...】");    TransactionTemplate transactionTemplate = new TransactionTemplate() ;    transactionTemplate.setTransactionManager(transactionManager);    return transactionTemplate;}

3、封装转账接口

接口方法

public interface AccountService {        void out (String outer , Integer money);        void in (String inner , Integer money);}

接口实现

@Servicepublic class AccountServiceImpl implements AccountService {    @Resource    private JdbcTemplate jdbcTemplate ;    public void out(String outer, Integer money) {        String sql = "update account set money = money - ? where username = ?";        jdbcTemplate.update(sql, money,outer);    }    public void in(String inner, Integer money) {        String sql = "update account set money = money + ? where username = ?";        jdbcTemplate.update(sql, money,inner);    }}

4、封装三个测试接口

测试接口

public interface TradeService {        void trade1(String outer ,String inner ,Integer money);        void trade2(String outer ,String inner ,Integer money);        void trade3(String outer ,String inner ,Integer money);}

接口实现

@Servicepublic class TradeServiceImpl implements TradeService {    @Resource    private AccountService accountService ;    @Resource    private TransactionTemplate transactionTemplate ;    @Override    public void trade1(String outer, String inner, Integer money) {        accountService.out(outer, money);        // 抛出异常        int i = 1/0;        accountService.in(inner, money);    }    @Override    public void trade2(String outer, String inner, Integer money) {        transactionTemplate.execute(new TransactionCallbackWithoutResult() {            public void doInTransactionWithoutResult(TransactionStatus arg0) {                accountService.out(outer, money);                // 抛出异常                int i = 1/0;                accountService.in(inner, money);            }        });    }    @Transactional(value="transactionManager",propagation= Propagation.REQUIRED)    @Override    public void trade3(String outer, String inner, Integer money) {        accountService.out(outer, money);        // 抛出异常        int i = 1/0;        accountService.in(inner, money);    }}

5、编写测试类

@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = TransactionApplication.class)public class TradeTest {    @Resource    private TradeService tradeService ;        @Test    public void testTrade1 (){        tradeService.trade1("jack", "rose", 1000);    }        @Test    public void testTrade2 (){        tradeService.trade2("jack", "rose", 1000);    }        @Test    public void testTrade3 (){        tradeService.trade3("jack", "rose", 1000);    }}

四、源代码地址

GitHub·地址https://github.com/cicadasmile/spring-boot-baseGitEE·地址Https://gitee.com/cicadasmile/spring-boot-base

--结束END--

本文标题: SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作

本文链接: https://www.lsjlt.com/news/230094.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作
    本文源码:GitHub·点这里 || GitEE·点这里一、事务管理简介事务基本概念一组业务操作ABCD,要么全部成功,要么全部不成功。特性:ACID原子性:整体一致性:完成隔离性:并发持久性:结果隔离问题脏读:一个事务读到另一个事务没有...
    99+
    2023-06-02
  • SpringBoot2 基础案例(13):基于Cache注解,管理Redis缓存
    本文源码:GitHub·点这里 || GitEE·点这里一、Cache缓存简介从Spring3开始定义Cache和CacheManager接口来统一不同的缓存技术;Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;Cache接口...
    99+
    2023-06-02
  • java基础理论Stream管道流Map操作示例
    目录一、回顾Stream管道流map的基础用法二、处理非字符串类型集合元素三、再复杂一点:处理对象数据格式转换四、flatMap一、回顾Stream管道流map的基础用法 最简单的需...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作