本文源码
GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base

一、事务管理简介

1、事务基本概念
一组业务操作ABCD,要么全部成功,要么全部不成功。
2、特性:ACID
原子性:整体
一致性:完成
隔离性:并发
持久性:结果
3、隔离问题
脏读:一个事务读到另一个事务没有提交的数据
不可重复读:一个事务读到另一个事务已提交的数据(update)
虚读(幻读):一个事务读到另一个事务已提交的数据(insert)
4、隔离级别
read uncommitted:读未提交。
read committed:读已提交。解决脏读。
repeatable read:可重复读。解决:脏读、不可重复读。
serializable :串行化。都解决,单事务。

二、Spring管理事务

1、顶级接口


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

2、事务状态

3、事务定义

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.0管理事务

基于转账的案例演示,基于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);
}

接口实现

@Service
public class AccountServiceImpl implements AccountService {@Resourceprivate 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);
}

接口实现

@Service
public class TradeServiceImpl implements TradeService {@Resourceprivate AccountService accountService ;@Resourceprivate TransactionTemplate transactionTemplate ;@Overridepublic void trade1(String outer, String inner, Integer money) {accountService.out(outer, money);// 抛出异常int i = 1/0;accountService.in(inner, money);}@Overridepublic 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)@Overridepublic 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 {@Resourceprivate TradeService tradeService ;/*** 没有事务管理* jack 减少了1000块钱,但是rose得到1000块钱* 1   jack    9000* 2 rose    10000*/@Testpublic void testTrade1 (){tradeService.trade1("jack", "rose", 1000);}/*** 手动管理事务* 1    jack    10000* 2    rose    10000*/@Testpublic void testTrade2 (){tradeService.trade2("jack", "rose", 1000);}/*** 注解管理事务* 1    jack    10000* 2    rose    10000*/@Testpublic void testTrade3 (){tradeService.trade3("jack", "rose", 1000);}
}

四、源代码地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base
码云地址:知了一笑
https://gitee.com/cicadasmile/spring-boot-base


SpringBoot2.0 基础案例(12):基于转账案例,演示事务管理操作相关推荐

  1. SpringBoot2.0基础案例分类总结,后续更新计划说明

    一.基础案例 1.基础案例概览 历时一个半月,SpringBoot2.0基础案例的文章基本更新完毕了,基础案例包含了SpringBoot的基础教程,高级应用,日志配置,数据库使用,事务管理等.关于Sp ...

  2. SpringBoot2.0 基础案例(14):基于Yml配置方式,实现文件上传逻辑

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.文件上传 文件上传是项目开发中一个很常用的功能,常见的如头像上 ...

  3. SpringBoot2.0 基础案例(13):基于Cache注解模式,管理Redis缓存

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.Cache缓存简介 从Spring3开始定义Cache和Cac ...

  4. SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口

    一.SpringBoot 框架的特点 SpringBoot2.0 特点 1)SpringBoot继承了Spring优秀的基因,上手难度小 2)简化配置,提供各种默认配置来简化项目配置 3)内嵌式容器简 ...

  5. SpringBoot2.0 基础案例(15):配置MongoDB数据库,实现增删改查逻辑

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.NoSQL简介 1.NoSQL 概念 NoSQL( Not O ...

  6. SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.Actuator简介 1.监控组件作用 在生产环境中,需要实时 ...

  7. SpringBoot2.0 基础案例(10):整合Mybatis框架,集成分页助手插件

    一.Mybatis框架 1.mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获 ...

  8. SpringBoot2.0 基础案例(09):集成JPA持久层框架,简化数据库操作

    一.JAP框架简介 JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范.主要是为了简化持久层开发以及整合ORM技术,结束H ...

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

    一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Login ...

最新文章

  1. AttributeError: ‘NoneType‘ object has no attribute ‘span‘
  2. Google Objective-C Style Guide
  3. linux 中FTP服务器的架设
  4. Javascript面向对象编程(一):封装
  5. iOS开发那些事--创建基于故事板的iOS 6的HelloWorld
  6. 无法从“cstring”转换为“lpcstr”_U盘重装系统后,无法使用?
  7. 洛谷P3588 [POI2015]PUS(线段树优化建图)
  8. 计算数字1至10的总和
  9. 软件工程考研复试基本概念
  10. Socket编程中,阻塞与非阻塞的区别
  11. eclipse(window平台)快捷键总结
  12. 债券价格和到期收益率的关系_债券价格为什么和到期收益率成反比呢?
  13. ev4加密视频转换成MP4格式
  14. node学习 express + mysql + ejs实现注册登录
  15. java透视图_Eclipse透视图
  16. 可能你需要一个王者荣耀刷金币神器(解除网瘾)
  17. c语言指针回顾——指针基础
  18. 【Vue】Vue中传值的几种方法,案例代码解析
  19. 服务器维护 藏宝阁交易,梦幻西游藏宝阁角色交易条件,藏宝阁买角色多久可以交易角色...
  20. 改变命运的早上三分钟 之 三

热门文章

  1. 全排列 DFS 回溯
  2. coredump_filter的设置
  3. Python Twisted介绍
  4. Nessus进行漏洞扫描的过程
  5. C/C++语言以某符号分割字符串
  6. C/C++:Windows编程—调用DLL程序的2种方法
  7. 排序算法:堆排序算法实现及分析
  8. JAVA中整数类型数据溢出问题研究
  9. 20171213-python自动化-接口测试-jmeter-get-设置header
  10. 支付宝支付系统繁忙,请稍后再试(ALI64)错误解决