Java多进程从头讲到尾,从基础到源码统统帮你搞定
常见的分布式事务场景
分布式事务其实就在我们身边,你一直在用,但是你却一直不注意它。
转账
扣你账户的余额,增加别人账户余额,如果只扣了你的,别人没增加这是失败;如果没扣你的钱别人也增加了那银行的赔钱。
下订单/扣库存
电商系统中这是很常见的一个场景,用户下单成功了,店家没收到单,不发货;用户取消了订单,但是店家却看到了订单,发了货。
分库分表场景
当我们的数据量大了之后,我们可能会部署很多独立的数据库,但是你的一个逻辑可能会同时操作很多个数据库的表,这时候该如何保证所有的操作要么成功,要么失败。
分布式系统调用问题
微服务的拆分让各个系统各司其职,但是带来的也有很多痛苦,一个操作可能会伴随很多的外部请求,如果某一个外部系统挂掉了,之前操作已完成的这些是否需要回滚。
针对上面这些问题,我们前面学过的数据库4大特性:ACID 似乎在这里想要达到就变得很困难,单机情况下你还可以通过锁和日志机制来控制数据,在分布式场景又该如何实现呢?在不同的分布式应用架构下,实现一个分布式事务要考虑的问题并不完全一样,比如对多资源的协调、事务的跨服务传播等,实现机制也是复杂多变。尽管有这么多工程细节需要考虑,但分布式事务最核心的还是其 ACID 特性,只是这种 ACID 变换了场景。
分布式理论
CAP 定理
传统的 ACID 模型肯定无法解决分布式环境下的挑战,基于此加州大学伯克利分校 Eric Brewer教授提出 CAP 定理,他指出 现代 WEB 服务无法同时满足以下 3 个属性:
- 一致性(Consistency) : 所有的客户端都能返回最新的操作。
- 可用性(Availability) : 非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。
- 分区容错性(Partition tolerance) : 即使出现单个组件无法可用,操作依然可以完成。
关于一致性的理解后面分出来三个方向:
- 强一致:任何一次读都能读到某个数据的最近一次写的数据。系统中的所有进程,看到的操作顺序,都和全局时钟下的顺序一致。简言之,在任意时刻,所有节点中的数据是一样的。
- 弱一致:数据更新后,如果能容忍后续的访问只能访问到部分或者全部访问不到,则是弱一致性。
- 最终一致:不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。简单说,就是在一段时间后,节点间的数据会最终达到一致状态。
关于一致性的理解不同,后面对于 CAP 理论的实现就有所不同。
另外 Eric Brewer教授指出现代 WEB 服务无法同时满足这 3 个属性,说的是无法同时满足,那这是为什么呢?
如果在某个分布式系统中无副本,那么必然满足强一致性,同时也满足可用性,但是如果这个数据宕机了,那么可用性就得不到保证。
如果一个系统满足 AP,那么一致性又得不到保证。所以 CAP 原则的精髓就是要么 AP,要么 CP,要么 AC,但是不存在 CAP。
BASE 定理
基于前面提到的 CAP,反正我们都无法同时满足CAP,设计系统的最高目的就是让他跑下去不出错,那么是不是可以不要求强一致性,最终让他一致即可。所以后面又提出来了 BASE 定理:
- Basically Available(基本可用)
- Soft state(软状态)
- Eventually consistent(最终一致性)
基于现在大型分布式系统的复杂性,我们无法保证服务永远达到999,那么是否可以取舍,核心服务达到999,非核心服务允许挂为了保全核心服务。另外在非核心服务 down 机过程中允许系统暂时出现不一致但是这个不一致并不影响系统的核心功能使用。
最终系统恢复,所有服务一起修复数据,最终达到一致的状态。
业内通常把严格遵循 ACID 的事务称为刚性事务,而基于 BASE 思想实现的事务称为柔性事务。柔性事务并不是完全放弃了 ACID,仅仅是放宽了一致性要求:事务完成后的一致性严格遵循,事务中的一致性可适当放宽。
常见的分布式事务实现方案
分布式事务实现方案从类型上去分刚性事务、柔型事务。刚性事务:通常无业务改造,强一致性,原生支持回滚/隔离性,低并发,适合短事务。柔性事务:有业务改造,最终一致性,实现补偿接口,实现资源锁定接口,高并发,适合长事务。
- 刚性事务:XA 协议(2PC、JTA、JTS)、3PC
- 柔型事务:TCC/FMT、Saga(状态机模式、Aop模式)、本地事务消息、消息事务(半消息)、最多努力通知型事务
两阶段提交(XA)
与本地事务一样,分布式事务场景下也可以采用两阶段提交的方案来实现。XA 的全称是 eXtended Architecture,它是一个分布式事务协议,通过二阶段提交协议保证强一致性。
XA 规范中定义了分布式事务处理模型,这个模型中包含四个核心角色:
- RM (Resource Managers):资源管理器,提供数据资源的操作、管理接口,保证数据的一致性和完整性。最有代表性的就是数据库管理系统,当然有的文件系统、MQ 系统也可以看作 RM。
- TM (Transaction Managers):事务管理器,是一个协调者的角色,协调跨库事务关联的所有 RM 的行为。
- AP (Application Program):应用程序,按照业务规则调用 RM 接口来完成对业务模型数据的变更,当数据的变更涉及多个 RM 且要保证事务时,AP 就会通过 TM 来定义事务的边界,TM 负责协调参与事务的各个 RM 一同完成一个全局事务。
- CRMs (Communication Resource Managers):主要用来进行跨服务的事务的传播。
XA 协议大概的两个流程为:
- 第一阶段(prepare):事务管理器向所有本地资源管理器发起请求,询问是否是 ready 状态,所有参与者都将本事务能否成功的信息反馈发给协调者;
- 第二阶段 (commit/rollback):事务管理器根据所有本地资源管理器的反馈,通知所有本地资源管理器,步调一致地在所有分支上提交或者回滚。
XA 协议是如何满足 ACID 的呢?
原子性和持久性我们就不用说,我们看看隔离性和一致性。
隔离性
XA 协议中没有描述如何实现分布式事务的隔离性,但是 XA 协议要求每个资源管理器都要实现本地事务,也就是说基于 XA 协议实现的分布式事务的隔离性是由每个资源管理器本地事务的隔离性来保证的,当一个分布式事务的所有子事务都是隔离的,那么这个分布式事务天然的就实现了隔离性。
一致性
在单机环境下的一致性就是保证当前服务器数据一致即可。事务执行完毕数据最终一致,不同的隔离级别下事务执行过程的中间状态不能被别的事务观察到。
事务执行完毕最终一致这个好保证,但是在RR 隔离级别下不可见一个未提交事务的中间态在分布式情况该如何做到呢?单机上 MySQL 提供了MVCC机制,采用多版本控制来处理,那分布式事务场景也是否也可以提供这样的机制呢?XA 协议并没有定义怎么实现全局的快照,一个基本思路是用一个集中式或者逻辑上单调递增的东西来控制生成全局 Snapshot,每个事务或者每条 SQL 执行时都去获取一次,从而实现不同隔离级别下的一致性。当然开发的难度还是挺大。
存在的问题:
-
同步阻塞:当参与事务者存在占用公共资源的情况,其中一个占用了资源,其他事务参与者就只能阻塞等待资源释放,处于阻塞状态。
-
单点故障:一旦事务管理器出现故障,整个系统不可用。
-
数据不一致:在阶段二,如果事务管理器只发送了部分 commit 消息,此时网络发生异常,那么只有部分参与者接收到 commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。
-
不确定性:当事务管理器发送 commit 之后,并且此时只有一个参与者收到了 commit,那么当该参与者与事务管理器同时宕机之后,重新选举的事务管理器无法确定该条消息是否提交成功。
总体来说 XA 方案实现简单,但是带来的问题如果放在数据一致性要求严格的场景是无法保证数据正确性的。另外事务管理器单点会带来隐患,同步阻塞模型也致使并发能力弱。
TCC
关于 TCC(Try-Confirm-Cancel)的概念,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。 TCC 事务机制相比于上面介绍的 XA,解决了其几个缺点:
- 解决了协调者单点,由主业务方发起并完成这个业务活动。业务活动管理器也变成多点,引入集群。
- 同步阻塞:引入超时,超时后进行补偿,并且不会锁定整个资源,将资源转换为业务逻辑形式,粒度变小。
- 数据一致性,有了补偿机制之后,由业务活动管理器控制一致性。
TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。TCC 模型完全交由业务实现,每个子业务都需要实现 Try-Confirm-Cancel 三个接口,对业务侵入大,资源锁定交由业务方。
- Try 阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)。
- Confirm 阶段:确认执行真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源,Confirm 操作满足幂等性。要求具备幂等设计,Confirm 失败后需要进行重试。
- Cancel 阶段:取消执行,释放 Try 阶段预留的业务资源 Cancel 操作满足幂等性 Cancel 阶段的异常和 Confirm 阶段异常处理方案基本上一致。
一个完整的业务活动由一个主业务服务与若干子业务服务组成:
- 主业务服务负责发起并完成整个业务活动;
- 业务服务提供 TCC 型业务操作;
- 业务活动管理器控制业务活动的一致性,它登记业务活动中的操作,并在业务活动提交时确认所有的TCC 型操作的 Confirm 操作,在业务活动取消时调用所有 TCC 型操作的 Cancel 操作。
比如一个转账操作:
- 首先在 Try 阶段先把转账者的钱包冻结起来。
- 在 Confirm 阶段,调用转账接口操作转账,转账成功后解冻。
- 如果 Confirm 阶段成功那么就转账成功,否则执行转账失败确认逻辑。
基于 TCC 实现分布式事务,会将原来只需要一个接口就可以实现的逻辑拆分为 Try、Confirm、Cancel 三个接口,所以代码实现复杂度相对较高,需要在业务中写很多的补偿机制代码。
TCC将事务提交划分成两个阶段,Try即为一阶段,Confirm 和 Cancel 是二阶段并行的两个分支,二选一。从阶段划分上非常像2PC,我们是否可以说TCC是一种2PC或者2PC变种呢?
对比一下 XA 事务模型,TCC 的两阶段提交与 XA 还是有一些区别:
- 2PC 的操作对象在于资源层,对于开发人员无感知;而 TCC 的操作在于业务层,具有较高开发成本。
- 2PC 是一个整体的长事务,也是刚性事务;而 TCC 是一组的本地短事务,是柔性事务。
- 2PC 的 Prepare (表决阶段)进行了操作表决;而 TCC 的 Try 并没有表决准备,直接兼备资源操作与准备能力。
- 2PC 是全局锁定资源,所有参与者阻塞 交互等待 TM 通知;而 TCC 的资源锁定在于 Try 操作,业务方可以灵活选择业务资源的锁定粒度。
本地消息表#
方案通过在事务主动发起方额外新建事务消息表,事务发起方处理业务和记录事务消息在本地事务中完成,轮询事务消息表的数据发送事务消息,事务被动方基于消息中间件消费事务消息表中的事务。
基于本地消息表的方案,每个事务发起方都需要额外新建事务消息记录表,用于记录分布式事务的消息的发生、处理状态。
事务发起方在处理完业务逻辑之后需要将当前事务保存在消息表中,之后将消息发送到消息中间件中,并将消息的状态设置为 “发送中”。
如果消息在投递过程中丢失怎么办呢?事务发起方可以设置一个定时任务主动扫描状态为 “发送中” 的消息重新投送。只有消息被业务方消费完毕返回消费成功的结果才确认成功并将消息状态改为“已发送”。
这里因为网络异常或者发送异常导致一个消息可能会被重复发送,所以要求接收方要做到幂等性,允许重复消费。
这种方案的好处就是方案简单,成本较低,实现也不复杂。
但是坏处也有很多,比如通过消息的方式延迟不好控制;本地消息表与业务耦合在一起没有做到通用性;本地消息表基于数据库来实现,有一定的瓶颈。
事务消息
上面说的本地消息表的模式无法支持本地事务执行和消息发送一致性的问题,如果能在本地事务执行和发消息这两个操作上加上事务,那岂不是完美。
基于这个思路, 在 MQ 中存储消息的状态才是真理,消息生产者先把消息发送给MQ,此时消息状态为“待确认”,接着生产者去执行本地事务,如果执行成功就给MQ发送消息让他更改消息状态为 “待发送”并发送消息,如果执行失败则删除消息。
这样就保证了本地事务和消息发送一致性问题。
- 首先事务发起方先往 MQ 发送一条预读消息,这条消息与普通消息的区别在于他只对 MQ 可见不会向下传播。
- MQ接受到消息后,先进行持久化,则存储中会新增一条状态为
待发送
的消息,接着给事务发起方返回处理完成的 ACK;事务发起方收到处理完成的 ACK 之后开始执行本地事务。 - 发起方会根据本地事务的执行状态来决定这个预读消息是应该继续往前还是回滚。另外 MQ 也应该支持自己反查来解决异常情况,如果发起方本地事务已经执行完毕发送消息到MQ,但是消息因为网络原因丢失,那么怎么解决。所以这个反查机制很重要。
- 本地事务执行成功以后,MQ 也接收到成功通知,接着将消息状态更新为可发送,然后将消息推送给下游的消费者,这个时候消费者就可以去处理自己的本地事务 。
注意点:由于MQ通常都会保证消息能够投递成功,因此,如果业务没有及时返回ACK结果,那么就有可能造成MQ的重复消息投递问题。因此,对于消息最终一致性的方案,消息的消费者必须要对消息的消费支持幂等,不能造成同一条消息的重复消费的情况。
SAGA 事务模型
Saga是什么?Saga的定义是 “长时间活动的事务 ”(Long Lived Transaction,后文简称为LLT)。他是普林斯顿大学 HECTOR GARCIA-MOLINA 教授在1987年的一篇关于分布式数据库的论文中提出来的概念。
Long Lived 从字面意义上不清晰,Long 到底意味着多长?事务持续时间是一个小时、一天甚至一周吗?其实都不是,时间跨度并不重要。重要的是什么?关键的是跨系统的多次“事务”,Saga 往往由多个外部子事务构成,需要通过多次外部系统的消息交互,才能将整体事务从开始迁移到结束状态,这和我们原来常见的在一个数据库的短事务不一样。比如一个旅行的订单,是由机票、旅馆、租车三个子订单构成,都需要外部的确认,缺任何一个步骤,不能成行,这就是一个典型的 LLT。
看起来 Sage 的定义与别的分布式事务没有什么不同。分布式事务不就是多个不同的子事务构成一个整体吗?再来看看 补偿机制:
每个本地事务有相应的执行模块和补偿模块,当 Sage 事务中的任意一个本地事务出错, 可以通过调用相关事务对应的补偿方法恢复,达到事务的最终一致性。
Saga 模型是把一个分布式事务拆分为多个本地事务,每个本地事务都有相应的执行模块和补偿模块(对应TCC 中的 Confirm 和 Cancel),当 Saga 事务中任意一个本地事务出错时,可以通过调用相关的补偿方法恢复之前的事务,达到事务最终一致性。
由于 Saga 模型中没有 Prepare 阶段,因此事务间不能保证隔离性,当多个 Saga 事务操作同一资源时,就会产生更新丢失、脏数据读取等问题,这时需要在业务层控制并发,例如:
- 在应用层面加锁;
- 应用层面预先冻结资源。
Saga 恢复方式
Saga 支持向前和向后恢复:
- 向后恢复:补偿所有已完成的事务,如果任一子事务失败;
- 向前恢复:重试失败的事务,假设每个子事务最终都会成功。
虽然 Saga 和 TCC 都是补偿事务,但是由于提交阶段不同,所以两者也是有不同的:
- Saga 没有 Try 行为直接 Commit,所以会留下原始事务操作的痕迹,Cancel 属于不完美补偿,需要考虑对业务上的影响。TCC Cancel 是完美补偿的 Rollback,补偿操作会彻底清理之前的原始事务操作,用户是感知不到事务取消之前的状态信息的。
- Saga 的补偿操作通常可以异步执行,TCC 的 Cancel 和 Confirm 可以跟进需要是否异步化。
- Saga 对业务侵入较小,只需要提供一个逆向操作的 Cancel 即可;而 TCC 需要对业务进行全局性的流程改造。
- TCC 最少通信次数为 2n,而 Saga 为 n(n=子事务的数量)。
因为也是采用补偿机制,那么必然要求服务保持幂等性,如果服务调用超时需要通过幂等性来避免多次请求带来的问题。
事务特性的满足:
原子性:Saga 协调器保证整体事务要么全部执行成功,要么全部回滚。
一致性:Sage 保证最终一致性。
持久性:Saga 将整体事务拆分成独立的本地事务,所以持久性在本地事务中很好实现。
但是隔离性 Saga 无法实现,因为大事务被拆分为多个小事务,每个事务提交的时机不同很难保证已提交的小事务不被别人可见。
目前业界提供两类 Saga 的实现方式:
-
一种是集中式协调的实现方式。
集中式协调方式就是通过一个 Saga 对象来追踪所有的 Saga 子任务的调用,由它来管理,追踪整个事务是否应该提交或补偿。
这种方式带来的缺点就是这种协调方式必然要与第一个Saga 事务耦合,即与业务耦合在一起。
-
一种是分布式实现方式。
分布式协调方式肯定就能避免耦合的问题。分布式实现的方案也很多,比如通过事件机制来实现,一条 Saga 事务链上的所有事务都订阅同一个事件,如果失败则通过失败对应的事件消息来回滚即可。
这种方式带来的好处肯定是显而易见的,但是也会有另一个问题,多个事件带来的肯定是高并发的处理,那么会不会因为多个事件处理相关的问题带来一些循环依赖的问题。
开源分布式事务框架简介
Seata
Seata(Simple Extensible Autonomous Transaction Architecture,简单可扩展自治事务框架)是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。
Seata 会有 4 种分布式事务解决方案,分别是 AT 模式、TCC 模式、Saga 模式和 XA 模式。
XA 模式
XA 模式是 Seata 将会开源的另一种无侵入的分布式事务解决方案,任何实现了 XA 协议的数据库都可以作为资源参与到分布式事务中,目前主流数据库,例如 MySql、Oracle、DB2、Oceanbase 等均支持 XA 协议。
XA 协议有一系列的指令,分别对应一阶段和二阶段操作。“xa start” 和 “xa end” 用于开启和结束XA 事务;“xa prepare” 用于预提交 XA 事务,对应一阶段准备;“xa commit”和“xa rollback”用于提交、回滚 XA 事务,对应二阶段提交和回滚。
在 XA 模式下,每一个 XA 事务都是一个事务参与者。分布式事务开启之后,首先在一阶段执行“xa start”、“业务 SQL”、“xa end”和 “xa prepare” 完成 XA 事务的执行和预提交;二阶段如果提交的话就执行 “xa commit”,如果是回滚则执行“xa rollback”。这样便能保证所有 XA 事务都提交或者都回滚。
XA 模式下,用户只需关注自己的“业务 SQL”,Seata 框架会自动生成一阶段、二阶段操作;XA 模式的实现如下:
- 一阶段:
在 XA 模式的一阶段,Seata 会拦截“业务 SQL”,在“业务 SQL”之前开启 XA 事务(“xa start”),然后执行“业务 SQL”,结束 XA 事务“xa end”,最后预提交 XA 事务(“xa prepare”),这样便完成 “业务 SQL”的准备操作。
- 二阶段提交:
执行“xa commit”指令,提交 XA 事务,此时“业务 SQL”才算真正的提交至数据库。
- 二阶段回滚:
执行“xa rollback”指令,回滚 XA 事务,完成“业务 SQL”回滚,释放数据库锁资源。
XA 模式下,用户只需关注“业务 SQL”,Seata 会自动生成一阶段、二阶段提交和二阶段回滚操作。XA 模式和 AT 模式一样是一种对业务无侵入性的解决方案;但与 AT 模式不同的是,XA 模式将快照数据和行锁等通过 XA 指令委托给了数据库来完成,这样 XA 模式实现更加轻量化。
AT 模式
AT 模式是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。
AT 模式的一阶段、二阶段提交和回滚
均由 Seata 框架自动生成,用户只需编写“业务 SQL”,便能轻松接入分布式事务,AT 模式是一种对业务无任何侵入的分布式事务解决方案。
TCC 模式
2019 年 3 月份,Seata 开源了 TCC 模式,该模式由蚂蚁金服贡献。TCC 模式需要用户根据自己的业务场景实现 Try、Confirm 和 Cancel 三个操作;事务发起方在一阶段 执行 Try 方式,在二阶段提交执行 Confirm 方法,二阶段回滚执行 Cancel 方法。
TCC 三个方法描述:
- Try:资源的检测和预留;
- Confirm:执行的业务操作提交;要求 Try 成功 Confirm 一定要能成功;
- Cancel:预留资源释放。
用户接入 TCC 模式,最重要的事情就是考虑如何将业务模型拆成 2 阶段,实现成 TCC 的 3 个方法,并且保证 Try 成功 Confirm 一定能成功。相对于 AT 模式,TCC 模式对业务代码有一定的侵入性,但是 TCC 模式无 AT 模式的全局行锁,TCC 性能会比 AT 模式高很多。
Saga 模式
Saga 模式是 Seata 即将开源的长事务解决方案,将由蚂蚁金服主要贡献。在 Saga 模式下,分布式事务内有多个参与者,每一个参与者都是一个冲正补偿服务,需要用户根据业务场景实现其正向操作和逆向回滚操作。
分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务提交。如果任何一个正向操作执行失败,那么分布式事务会去退回去执行前面各参与者的逆向回滚操作,回滚已提交的参与者,使分布式事务回到初始状态。
《MySql面试专题》
《MySql性能优化的21个最佳实践》
《MySQL高级知识笔记》
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
获取方式:点击这里前往传送门
Ru3lqEPv-1627566397937)]
[外链图片转存中…(img-QzetWwFT-1627566397937)]
[外链图片转存中…(img-Mb8OjIGr-1627566397938)]
[外链图片转存中…(img-0bKE5Fxu-1627566397939)]
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
[外链图片转存中…(img-XThEkWy2-1627566397940)]
获取方式:点击这里前往传送门
关注我,点赞本文给更多有需要的人
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 985毕业,半路出家28岁进军Java,坚持奋斗了三年现如今年薪36W+
背景 26岁985研究生毕业,学的土木工程相关的专业。工作半年,存款3000,半年后调到深圳总部(公司央企),工作一年差不多也就几万存款,感觉生活无望,就直接决定转行。 说实在的…...
2024/4/19 22:39:03 - React 属性 函数式组件 Hooks(学习第三天)
目录一.React属性1.PureComponent(1)介绍PureComponent(2)为什么用 PureComponent ?(3)PureComponent优点(4)PureComponent缺点2.ref(1)ref是什么…...
2024/4/28 1:39:27 - Java大厂74道高级面试合集,附小技巧
part 1Java基础核心技术总结 万事都离不开根基,Java基础对于一些老鸟来说可能已经很熟悉了,但是对于很多开发5年以下的朋友掌握的或许不是很牢固,因此这份笔记更适合温故而知新。 Part 2并发编程(架构师筑基必备) 并发…...
2024/4/19 22:38:50 - lambda表达式中的箭头函数
语法结构 java中lambda表达式的语法结构:(params) -> expression。 由三部分构成: 第一部分是括号以及括号内部的形式参数 第二部分是"->"箭头符号 第三部分是expression方法体,方法体可以是代码块也可以是执行表达式。 //1. lambda表…...
2024/4/19 22:38:45 - Elasticsearch集成(二)
49-框架集成-SpringData-整体介绍 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA(Elastics…...
2024/4/19 22:38:31 - 项目实训第五周(二)
编写测试报告 目录 1. 概述 1.2系统背景 1.3测试范围 1.4参考资料 2.系统分析与测试内容设计 2.1系统功能分析 2.2功能需求 3.测试计划执行情况 3.1测试类型 3.2测试环境与配置 3.3测试问题总结 4.测试总结 4.1测试用例执行结果 4.2测试问题解决 4.3测试结果分…...
2024/4/28 1:32:09 - 三个数求最大值,最小值,并排序
...
2024/4/8 20:51:31 - File类和匿名内部类
文章目录File类和匿名内部类1. File类1.1 File类概述1.2 File类构造方法1.3 File类创建文件和文件夹的方法1.4 File类删除文件和文件夹的方法1.5 File类判断方法1.6 File类鸡肋方法1.7 File类列表方法1.8 FilenameFilter过滤器2. 匿名内部类 Anonymous Inner Type2.1 接口和实现…...
2024/4/20 23:11:35 - Java学习的三个终极问题及学习路线规划,论程序员成长的正确姿势
蚂蚁花呗第一次技术面(60min): Java容器有哪些?哪些是同步容器,哪些是并发容器?ArrayList和LinkedList的插入和访问的时间复杂度?java反射原理, 注解原理?说说一致性 Hash 原理新生…...
2024/4/19 14:53:37 - 快速排序 - python
快速排序 学习来源:b站 python分享站 快速排序:首先,让列表第一个元素归位。如图,一个列表,两个箭头分别表示left和right, 把5拿出来,right从右往左遍历把比5小的值移到左边,当ri…...
2024/4/26 19:32:34 - java 对象内存大小计算(基于64位操作系统)
计算对象大小需要了解java对象内存布局。在HotSpot 虚拟机中,对象在内存中布局分为三块区域,对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 对象头 对象头主要包括…...
2024/4/11 23:31:15 - 图解SQL语句:经典排名问题+TOP N
力扣178题 分数排名问题 题目: 如果两个分数相同,则两个分数排名(Rank)相同,平分后的下一个名次应该是下一个连续的整数值值。换句话说,名次之间不应该有“间隔”。 idsalary1100289384489568 根据推断:所得到的…...
2024/4/27 23:19:25 - 数据结构——栈
数据结构——栈栈1.栈的概念:2.栈的基本运算:3.基本操作的代码:栈的顺序存储结构顺序栈基本操作置空栈判空栈入栈出栈取栈顶元素注意事项多栈共享邻接空间共享栈的基本操作栈 1.栈的概念: 栈作为一种数据结构,是一种…...
2024/4/20 2:49:03 - BigData File Viewer工具介绍
目录1.概述2.官网地址3.功能4.使用方法1.概述 BigData File Viewer时一个跨平台(例如Windows,MAC,Linux等)的桌面应用程序,它用于查看常见的大数据二进制格式,例如Parquet,ORC,AVRO…...
2024/4/21 8:52:36 - 第8章 JSP
目录8.1 概念:8.2 原理8.3 JSP的脚本8.4 JSP的内置对象:requestresponseout:字符输出流对象8.5 案例:改造Cookie案例8.6 指令8.7 注释:8.8 内置对象8.9 MVC:开发模式8.9.1 jsp演变历史8.9.2 MVC:8.9.3 MVC优缺点&#…...
2024/4/24 7:05:52 - 玩转5G之--网络布线2 详细解说
目录 前言: 上期回顾: 本期内容: 1.交叉线:交叉电缆 2.线缆的连接: 3.制作双绞线跳线: 4.信息插座的安装: 5.双绞线连通性测试: 6.无线传输介质: 一. 无线电波&a…...
2024/4/27 20:20:48 - 2021-07-29牛客网面试题练习总结
escape方法: 该方法返回对一个字符串编码后的结果字符串 eval方法:该方法将某个参数字符串作为一个JavaScript执行 parseFloat方法:该方法将一个字符串转换成对应的小数 isNaN方法:该方法用于检测参数是否为数值型,…...
2024/4/21 0:07:07 - Python中pip命令出现Microsoft Visual C++ 14.0 is required问题的解决方法
很多网上遇到这种问题大都是安个pycharm,jupyter notebook之类的,然后在里面配置环境,那么如何不下载而简单解决呢?当然vs的某些东西要下载是避免不了的。 首先如果在下面这个网站找相应版本python的whl文件,cp37代表为…...
2024/4/21 19:25:47 - 【Numpy】numpy.random.uniform均匀分布
numpy.random.uniform函数的用法numpy.random.uniform()函数其他随机数产生函数1、numpy.random.randint(low, highNone, sizeNone, dtypel)2、numpy.random.random_sample(sizeNone)3、numpy.random.rand(d0, d1, ..., dn)4、numpy.random.randn(d0,d1,...,dn)nump…...
2024/4/27 2:07:34 - React中styled-components的使用(样式组件库)
一、官网地址 https://www.styled-components.com/二、styled-components 1、styled-components 样式化组件,主要作用是它可以编写实际的CSS代码来设计组件样式,也不需要组件和样式之间的映射,即创建后就是一个正常的React 组件,…...
2024/4/23 11:26:24
最新文章
- springboot+springsecurity+vue前后端分离权限管理系统
有任何问题联系本人QQ: 1205326040 1.介绍 优秀的权限管理系统,核心功能已经实现,采用springbootvue前后端分离开发,springsecurity实现权限控制,实现按钮级的权限管理,非常适合作为基础框架进行项目开发。 2.效果图…...
2024/4/28 4:12:26 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 算法四十天-删除排序链表中的重复元素
删除排序链表中的重复元素 题目要求 解题思路 一次遍历 由于给定的链表是排好序的,因此重复的元素在链表中的出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。 具体地,我们从指针cur指向链表的头节…...
2024/4/23 6:25:37 - WPS二次开发专题:WPS SDK实现文档打印功能
作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 在办公场景或者家教场景中经常碰到需要对文档进行打印…...
2024/4/26 8:23:14 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/28 4:04:40 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/27 3:39:11 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/27 12:24:35 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/27 12:24:46 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/27 3:39:08 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/27 3:39:07 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/27 3:39:07 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/27 12:44:49 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/27 21:08:20 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/26 22:35:59 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/27 18:40:35 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/27 3:39:03 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/27 13:52:15 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/27 13:38:13 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/27 1:03:20 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/27 3:22:12 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/27 22:51:49 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/27 3:39:00 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/26 23:53:24 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/27 20:28:35 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57