范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBoot进阶之事务管理及并发问题

  SpringBoot进阶之事务管理及并发问题前言
  大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开  「基础知识」  的铺垫。目前正在出一个SpringBoot 长期系列教程,从入门到进阶, 篇幅会较多~ 适合人群学完Java基础  想通过Java快速构建web应用程序  想学习或了解SpringBoot
  「大佬可以绕过 ~」  背景
  如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获 ~ 情景回顾
  上期带大家学习了 SpringBoot 中如何去拦截请求, 本期将带大家学习MyBatis 中如何进行事务管理 ,同样的,我们集成到Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码 往期内容我的博客(阅读体验较佳)  Springboot入门  Springboot基础(一)  Springboot基础(二)  Springboot基础(三)  Springboot基础(四)  Springboot基础(五)  SpringBoot进阶之缓存中间件Redis  SpringBoot进阶之MyBatis分页插件  SpringBoot进阶之跨域问题处理(CORS)  SpringBoot进阶之日志集成  SpringBoot进阶之请求拦截  项目源码(持续更新 )springboot-all  什么是事务管理
  我们先了解一下它的基本概念。其实 事务 它不仅是在这里我们提到的mybatis ,其实它在数据库中也是存在的。事务 我们从字面意思理解,它好比烤面包,经过一些列的步骤之后,最终提供给客户完整的面包,也就是说中间出现差错,就得回退。可能举这个例子不大合适,再举一个我们业务中的场景吧。用户购买一个商品,首先下单,下完单之后进行支付,支付成功后订单为支付成功状态,跳转成功页,这一系列操作就是一个事务,要么成功要么失败。
  在通过上面的例子有了大概了解之后,我们再看看它的基本概念。  数据库事务(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。  sql执行事务操作
  下面带大家看看 sql 如何执行事务操作。下面举个例子比较一下
  没有事务操作的时候:   # 支付 update user_info set money=-100 where user_id=1  # 该订单状态 为成功 update order set status=1 where id=1
  以之前的场景给大家举例, 用户支付减少余额 并改订单状态为成功。 当我们的程序执行了上边的两条 sql ,大家觉得有问题吗?这肯定得出事,这不得被人薅死。虽然语句没报错,但是逻辑错了,为啥 因为余额变成负数了,这不是没钱白嫖,还指望用户给你冲上吗。然后订单还给成功了,如果遇到并发大的时候,这得多少钱,发还是不发货呢?告诉用户系统问题?老板看了得哭死。
  所以不管是程序上的错误(sql执行错误),还是逻辑上的错误都不能进行下一步操作,所以事务显的尤为重要。那么 sql 怎么提交事务呢? # 开启事务 BEGIN;  # 执行操作  # 支付 update user_info set money=-100 where user_id=1  # 查询用户剩余金额 (这里只是举例, 实际上应该在事务执行之前就应该判断) select money from user_info where user_id=1 and money >= 0  # 发现异常, 金额不对,执行回滚操作 ROLLBACK;  # 如果没有异常 该订单状态 为成功 update order set status=1 where id=1  # 提交事务 COMMIT;
  上边只是给大家举个例子,生成中我们还得用 mybatis 去操作。 Mybatis中进行事务操作
  在 SpringBoot 中执行事务非常简单,首先要开启事务@EnableTransactionManagement ,在启动类上加上: @EnableTransactionManagement @EnableConfigurationProperties({AppConfig.class}) @SpringBootApplication public class Application {     public static void main(String[] args) {         SpringApplication app = new SpringApplication(Application.class);         // 关闭 banner         app.setBannerMode(Banner.Mode.OFF);         app.run(args);     } }
  添加控制器方法:   @Transactional(rollbackFor = Exception.class)     @GetMapping("trans")     @ResponseBody     public String transUser(@RequestParam String name) throws Exception {         userRoleMapper.addRole(name);         if(name.equals("xiaohong")) {             throw new Exception("trans error");         }          userRoleMapper.updateRole(2);         return "success";     }
  我们访问 http://localhost:8877/api/user/trans?name=xiaohong , 发现数据库并没有产生新纪录和更新记录,@Transactional(rollbackFor = Exception.class) 表示开启一个事务,当捕获到Exception 异常就进行回滚。把name 换掉会发现,执行成功了。
  执行失败的时候:  Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@45e9d87] Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@45e9d87]
  那有没有 手动 去执行回滚操作的呢?有时候,我们总不能靠异常来判断,需要通过逻辑判断:  @Transactional(rollbackFor = Exception.class)     @GetMapping("trans")     @ResponseBody     public String transUser(@RequestParam String name) throws Exception {         userRoleMapper.addRole(name);         if(name.equals("xiaohong")) {             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();             return "fail";         }          userRoleMapper.updateRole(2);         return "success";     }
  上边的方法  TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 就是干这个的。 并发产生的事务问题
  其实本节到这里差不多就结束了,给大家多讲一点, 其实这一块内容理论知识点还是比较多多的,这也是面试比较喜欢问的,因为这里真就靠大家自己去理解和学习了,写代码谁都会,但是讲出来,不一定每个人都讲的好和清楚,因为每个人的理解和认知不一样。
  有时候,客户反馈有 bug ,反馈到你这边,你可能会说,我这都是好的。因为我们是本地的,不是跑在线上的,本地就你自己完,所以觉得没啥问题。但线上是很多用户在使用,当多用户使用的时候就会产生并发问题,所以也就是在接口测试的时候为什么要进行一下测试环境的压测,合格后上线。
  那么在并发大的时候,我们数据库可能会产生什么问题呢?  丢失更新(有两类)  脏读  不可重复读  幻读
  好,我们一个一个讲,首先说说什么是丢失更新?  丢失更新
  一个事务覆盖另一个事务已提交的更新数据叫丢失更新。这里提到过它存在两种丢失情况,为了让大家能够更加直观的感受,我以存钱和取钱为例讲一下。
  首先说说第一种丢失情况
  先分配一下角色,事务A,事务B,账户C。 首先A对C进行账户查询,余额为5000,B对A查询,余额为5000,此时余额一样没啥问题。紧接着B对C进行存钱操作,存了1000, 存完B提交事务。而此时A呢,正对着C进行取钱,取了1000, 它也提交了事务。那么问一下大家, C还有多少钱?
  最后A查了一下账户,发现只有4000, 发现少了1000。
  下边我们把压力给到A这边,第二种其实跟上边是反过来,情况是怎么样的呢?首先A,B跟之前一样,查了下C,余额为5000。此时,A对C进行取钱操作,取了1000,然后提交事务,B呢对A进行存钱操作,存了1000,提交事务。最后B一查,发现账户有6000, C开心极了, 多了1000
  上边这两种情况都属于丢失更新的情况  脏读
  一个事务读取到另一个事务还没提交的数据叫脏读。我们还以上边的为例:
  这个稍微好理解一点,事务A和B, 事务A对C进行取钱操作,取了1000, 余额还剩 4000, 此时B呢对C进行查询操作,读到余额为4000。这时产生问题了,因为A现在还是一个未提交的事务,A对账户C取钱操作进行了 回滚 , 紧接着存了1000, 然后进行了事务提交 , 此时余额为6000。而我们的B读到的数据是4000,所以这就是脏读  不可重复读
  一个事务先后读到另一个事务提交之前的数据和已提交的更新数据。同样的以上边为例,这个大家可能不好理解,下面好好分析一下:
  首先事务A和B, A先查询C余额还有 5000, B 查询C,余额还有5000, 紧接着A对C执行取钱操作,取了1000, 提交事务, 此时B执行查询操作,发现C只有4000了。你可能想,这没问题啊,取了1000还有4000,没毛病啊。没问题吗?重复读了两次,结果不一致,这肯定是有问题的。  幻读
  事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据。这有点抽象,同样的,还以上边为例
  事务A和B,B查询C,余额5000, A注销了C,提交了事务,此时B又去查询C, 发现C没了,B事务查询两次,结果确不一致,跟产生了幻觉一样,刚刚还在的,这会没了。
  通过上边的几个例子,带大家认识了,并发中可能产生的事务问题,下边给大家总结一下事务的特点, 事务有4个特性,被称为 ACID  持久性 (Durability)  隔离性 (Isolation)  一致性 (Consistency)  原子性 (Atomicity)
  下边就给大家讲讲这几个特性:  什么是持久性
  事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。  什么是隔离性
  数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。  什么是一致性
  在事务开始之前和事务结束以后,数据库的完整性没有被破坏  什么是原子性
  一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成  事务隔离级别未提交读 Read Uncommitted  已提交读 Read Committed  可重复读 Repeatable Read  可串行化 Serializable  结束语
  隔离级别就不给大家讲了,这不是本节的重点内容。本节的重点是大家要学会在 SpringBoot 中如何去执行事务操作 ,如果你对上边提到的一些概念性的东西还不能理解,也没关系,等以后回过头来看看也许就明白了,做个简单的了解。 下期预告
  有时候我们的系统需要对用户进行区分,也就是不同的用户角色访问不同的资源,比如管理员可以访问后台,而普通用户只能访问前台的页面,再或者只有登录的用户才能访问特定功能,高级管理员可以掌管大局,普通的管理员只能查看某一个菜单。这就是涉及到权限问题了,几乎所有的系统都需要权限管理,这样能保证系统资源的安全性。下期将会带大家学习 Shiro权限 框架, 它是一个轻量级框架,但它的功能确不小, 我会从入门到进阶讲起, 会分为多期去讲。
  下期见,关注我,不迷路~

物联网卡的流量都是真实的吗?欢迎来到东用小知识课堂,每天学习一分钟,让你紧跟时代,扩充自己,成为大佬不是梦!物联网卡的流量都是真实的吗?凡是用过物联网卡的人都知道,它的优势就是费用低,流量大,有的物联网卡可以泰山众筹新零售模式流量池裂变关系链新思路所谓市场机会就是做生意赚钱的机会,即市场上未满足的需求,所谓企业营销机会,就是对这个企业的营销活动具有吸引力的在此能享受竞争优势,或者成本优势,或者产品优势的市场机会,那么企业平台换散热换扣具换风扇,intel12700K平台小微升级小晒我在前段时间装了一台白色主题的主机,虽然这台主机的内存不是白色,主机的核心硬件配置谈不上高配,但基本也已经满足了自己日常游戏的基本需求。CPU为采用7nm工艺的inteli7127曾供不应求如今变相降价,12GB512GB天玑9000,价格更良心了买手机送耳机之前在手机行业中是很常见的一件事,所以当部分手机厂商取消这种措施之后,许多消费者都感觉厂商们越来越小气了,但事实上之所以许多手机厂商们卖手机不再附赠耳机,其实恰恰是因为为爱证明?CleerARC的520专属礼盒让我送礼不发愁是不是还在为520送什么发愁呢?相信有些小伙伴已经有自己钟意的礼物,但是肯定还有很多人不知道送什么吧。小编作为数码博主,这几天也一直给大家在挑选合适的礼物。近年来,你会发现数码产品放弃34市场份额,三星坚持断供背后,中国需引以为戒作为全球数一数二的手机品牌,三星和苹果会主动放弃某个市场吗?可能很多人会觉得这个问题有些荒谬。苹果和三星有一个共同点,那就是追求利益最大化,因此要让苹果和三星主动放弃某个市场,几乎realme正式推出X50Pro5G,为什么这么好?G3。0指纹识别解锁近来,推出新手机产品的节奏又回到生活正轨,在不久之前,发展势头很好的realme也正式推出了自己的旗舰产品真我手机X50Pro5G。真我手机X505G发布会上公开说今年会有alli采用双屏幕超声波屏下指纹!vivoXFold或让解锁体验迈入全新层面近两年,推出折叠屏机型成为了手机厂商们的全新动向。而在当前,手机品牌vivo是为数不多仍没有发布折叠屏机型的大厂之一。就在不久前,数码博主数码闲聊站率先曝光了vivo旗下首款折叠屏苹果在售四种最新iPad的差别介绍(论文级别)众所周知,苹果除了iPhone是手机界的领袖,iPad在平板中的地位也是无可撼动的。iPad的类型多种多样,不同的型号符合不同用户的需求,iPadpro也是iPad中性能最佳也是价荣耀X30和荣耀50哪款比较好?作为消费者应该如何选择?文小伊评科技荣耀X30以及荣耀50是以及荣耀60是目前荣耀家族中的两款明星产品,那么这两款产品作为消费者应该如何选择?本文就来一探究竟。我们先来看配置上的差别差别1处理器。荣耀X3荣耀这款机型加速清仓,还有100W快充和120Hz刷新率时间到了3月份,各大厂商的新机基本已经发布。哪个更强哪个弱,未来会有一个答案,但我们也可以发现,现在厂商只是在更新旗舰系列,至于入门级和中端产品,还没有一个新品一鸣惊人产品还没有,
4999起售的小米MIX4,看完这些参数,你会买吗?小米MIX4的发布会介绍结束了,价格也许出来了,起步价4999元,最高6299元,配置的话是CUP全面屏,一块完整的屏幕相机隐藏于屏幕之下。400PPI20MP屏下前置相机厚度是8华为手机电池不耐用?这3点是关键,难怪手机耗电快续航差手机使用一段时间后,总感觉电池耗电快,手机卡顿,续航差,对于经常玩游戏的朋友来说,一天三充都不够用,给大家带来了很多不便!无论是苹果手机还是安卓手机,都难逃此劫。手机电池一般的使用安兔兔手机性能榜出炉华为旗舰榜上无名,安卓之光排名垫底日前,安兔兔公布2021年7月份安兔兔安卓旗舰手机性能排行榜,直观地展现出各大机型的性能情况。值得注意的是,华为旗舰机又一次全军覆没。华为最新的麒麟9000处理器,虽然在性能上有了当麦克风成为真正生产力意味着唯乐狗G9收音效果就成为我手上最佳收音差噪音高,这一直都是限制视频制作者整体视频质量的一大因素而在短视频大火的今天,视频成为越来越多自媒体人的主要传播形式以及粉丝认识自己的创作方式,作为一名刚刚尝试视频创作不久的自用老存储卡还想拍4K视频?赶紧换上三星PROPlusSD存储卡吧随着视频的爆火,我身边的好多朋友都投入到了视频制作和传播的行列中来,其中很大一部分的用户购买了专业的可以拍摄4K素材的设备,但是在拍摄的过程中会发现视频没法正常录制的情况经常发生,鸿蒙再换小目标在系统行业的共识中,一款新的操作系统至少需要占据16(2。4亿台手机5。6亿台)的市场份额才能够成功存活下来,但在谷歌Android系统占比达72。2,苹果iOS占比为26。99的iPhone13相机重磅升级,新功能基本都在这里了距离9月份苹果秋季发布会越来越近,iPhone13系列也快要和大家见面了,相关的爆料信息也大量出现。在之前对iPhone13系列的外观爆料中,iPhone13ProMax的摄像头模央视,人民日报再次点名,鸿蒙表现超预期,华为也是果断改口当前市场上的手机操作系统除了谷歌的安卓就是苹果iOS,两大系统称霸天下的形势已经持续多年。但是,华为鸿蒙系统的出现改变了这一切,在竞争激烈的两大巨头面前,鸿蒙杀出了一条生路。不管是仅3699元,华为优质5G手机现货供应,50倍变焦鸿蒙OS128GB相信很多人都有类似的经历,当自己或者朋友想要买手机时,很多人都会推荐华为,但是今年的情况不太一样。你会发现,周边的不少朋友,就算是去购买新机,也选择了其它的品牌,比如小米OPPOv智能厨房中的全能主角小米家居的产品线继续在智能家居领域发力,最近更是在厨房上下足了功夫。自小米品牌推出第一款产品电饭煲压力IH电饭煲以来,小米先后推出了电磁炉电烤箱微波炉等厨卫电器产品。近日,小米再次1299元起,搭载三星Exynos880芯片,vivoY70t颇具看点哈喽大家好,我是你们的老朋友小馨,每天都会给大家更新我的原创内容,作为vivo旗下定位中低端市场的产品序列,Y系列此前凭借着多款机型在产品端的出色表现,也受到了众多消费者的青睐。该