【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】
持续学习&持续更新中…
守破离
【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】
- 本地事务
- 事务的基本性质
- 事务的隔离级别(下面四个越往下,隔离级 别越高,并发能力越差)
- 事务的传播行为(是否共用事务)
- 事务的坑 :本地事务方法互调,其他方法的事务设置失效
- 问题:本地事务,在分布式系统下,只能控制住自己的回滚,控制不了其他服务的回滚
- 分布式事务
- 分布式系统经常出现的异常
- CAP 定理
- 分布式系统中实现一致性的 raft 算法
- BASE 理论
- 强一致性、弱一致性、最终一致性
- 分布式事务几种方案
- 2PC 模式
- 柔性事务-TCC 事务补偿型方案
- 柔性事务-最大努力通知型方案
- 柔性事务-可靠消息+最终一致性方案(异步确保型)
- 分布式事务—Seata
- 整合Seata
- 参考
本地事务
事务的基本性质
数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation) 和持久性(Durabilily),简称就是 ACID;
- 原子性:一系列的操作整体不可拆分,要么同时成功,要么同时失败
- 一致性:数据在事务的前后,业务整体一致。:转账。A:1000;B:1000; 转 200 ; 事务成功: A:800 B:1200
- 隔离性:事务之间互相隔离。
- 持久性:一旦事务成功,数据一定会落盘在数据库。
在以往的单体应用中,我们多个业务操作使用同一条连接操作不同的数据表,一旦有异常, 我们可以很容易的整体回滚;
- Business:我们具体的业务代码
- Storage:库存业务代码;扣库存
- Order:订单业务代码;保存订单
- Account:账号业务代码;减账户余额
比如买东西业务,扣库存,下订单,账户扣款,是一个整体;必须同时成功或者失败,一个事务开始,代表以下的所有操作都在同一个连接里面;
事务的隔离级别(下面四个越往下,隔离级 别越高,并发能力越差)
-
READ UNCOMMITTED(读未提交) :该隔离级别的事务会读到其它未提交事务的数据,此现象也称之为脏读。
-
READ COMMITTED(读已提交) :一个事务可以读取另一个已提交的事务。Oracle和SQL Server的默认隔离级别。
同一个事务中,该隔离级别下,同样的 select 多次读取会读出不一样的结果,此现象称为不可重复读问题 -
REPEATABLE READ(可重复读) :该隔离级别是 MySQL 默认的隔离级别 :在同一个事务里,同样的 select 操作,select到的结果始终是事务开始时时间点的状态。 因此,同样的 select 操作在该事务中读到的结果会是一致的,但是,会有幻读现象。MySQL 的 InnoDB 引 擎可以通过 next-key locks 机制来避免幻读。
-
SERIALIZABLE(序列化) :在该隔离级别下事务都是串行顺序执行的,MySQL数据库的 InnoDB 引擎会给读操作隐式加一把读共享锁,从而避免了脏读、不可重读复读和幻读问题。
事务的传播行为(是否共用事务)
-
PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务, 就加入该事务,该设置是最常用的设置。
-
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
-
PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
-
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
-
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
-
PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
-
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。
事务的坑 :本地事务方法互调,其他方法的事务设置失效
- 同一个对象内,事务方法互调,其他方法的事务设置默认失效,原因:绕过了代理对象,没有用到代理对象,事务使用代理对象来控制的
- 解决:使用代理对象来调用其他事务方法
1)、引入aop-starter:spring-boot-starter-aop;引入了aspectj<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>2)、@EnableAspectJAutoProxy(exposeProxy = true);开启 aspectj 动态代理功能。以后所有的动态代理都是aspectj创建的(即使没有接口也可以创建动态代理)。exposeProxy = true:对外暴露代理对象3)、本类互调用代理对象调OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();orderService.b();orderService.c();
//事务的隔离级别(isolation = Isolation.REPEATABLE_READ)//REQUIRED、REQUIRES_NEW//坑:同一个对象内,事务方法互调,他们的事务设置默认失效,原因:事务使用代理对象来控制的,直接调用绕过了代理对象@Transactional(timeout = 30)public void a() {//使用this调用,b,c做任何设置都没用。都是和a公用一个事务
// this.b(); 没用
// this.c(); 没用OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();orderService.b(); //a事务。应用到了自己的事务设置REQUIRED,如果是REQUIRED,那么自己的事务设置不起作用,和a()共用orderService.c(); //新事务。应用到了自己的事务设置REQUIRES_NEW, timeout = 20 ,自己的事务设置起作用
// bService.b(); //a事务
// cService.c(); //新事务int i = 10 / 0;}@Transactional(propagation = Propagation.REQUIRED, timeout = 2)public void b() {//执行了7s,回滚不}@Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 20)public void c() {}
问题:本地事务,在分布式系统下,只能控制住自己的回滚,控制不了其他服务的回滚
- 库存调用成功了,但是网络原因,或者其他原因,导致Feign调用超时了,此时:订单回滚,库存不会回滚。
- 假如还有个远程扣减积分服务是在订单服务调用成功后调用的,该服务出异常 :订单会回滚;由于库存服务已经成功的远程执行,不会回滚。
//本地事务,在分布式系统下,只能控制住自己的回滚,控制不了其他服务的回滚//应该使用分布式事务,但是分布式事务比较复杂,比较复杂的最大原因:网络问题+分布式机器。
// @GlobalTransactional //高并发@Transactional@Overridepublic SubmitOrderResponseVo submitOrder(OrderSubmitVo vo) {confirmVoThreadLocal.set(vo);SubmitOrderResponseVo response = new SubmitOrderResponseVo();MemberRespVo memberRespVo = LoginUserInterceptor.loginUser.get();response.setCode(0);String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";String orderToken = vo.getOrderToken();Long result = redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Arrays.asList(OrderConstant.USER_ORDER_TOKEN_PREFIX + memberRespVo.getId()), orderToken);if (result == 0L) {response.setCode(1);return response;} else {//令牌验证成功 //下单:去创建订单,验令牌,验价格,锁库存...//1、创建订单,订单项等信息OrderCreateTo order = createOrder();//2、验价if (Math.abs(order.getOrder().getPayAmount().subtract(vo.getPayPrice()).doubleValue()) < 0.01) { //金额对比// 3、保存订单saveOrder(order);//4、库存锁定。只要有异常回滚订单数据。// 库存锁定需要的数据:订单号,所有订单项(skuId,skuName,num)//4、远程锁库存R r = wareFeignService.orderLockStock(getLockVo(order));//TODO 问题1:库存调用成功了,但是网络原因,或者其他原因,导致Feign调用超时了,此时:订单回滚,库存不会回滚。if (r.getCode() == 0) {//锁成功了response.setOrder(order.getOrder());//TODO 问题2:假如还有个远程扣减积分服务// 该服务出异常 :订单会回滚;由于库存服务已经成功的远程执行,不会回滚。int i = 10/0; //模拟扣减积分出异常//TODO 清除购物车已经下单的商品return response;} else {//锁定失败response.setCode(3);String msg = (String) r.get("msg");throw new NoStockException(msg);}} else {response.setCode(2);return response;}}}
分布式事务
分布式系统经常出现的异常
机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠的 TCP、存储数据丢失…
分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免。
CAP 定理
CAP 原则又称 CAP 定理,指的是在一个分布式系统中
- 一致性(Consistency):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访 问同一份最新的数据副本)
- 可用性(Availability):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据 更新具备高可用性)
- 分区容错性(Partition tolerance):大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。 分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们, 剩下的 C 和 A 无法同时做到。
对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所 以节点故障、网络故障是常态,而且要保证服务可用性达到 99.99999%(N 个 9),即保证 P 和 A,舍弃 C。
分布式系统中实现一致性的 raft 算法
http://thesecretlivesofdata.com/raft/
https://raft.github.io/
raft算法核心:领导选举、日志复制
领导选举、日志复制这两个动作的过程中有两个时间在起作用:自旋时间 (随机的,也叫选举时间)、心跳时间(固定的,指定的时间间隔)
raft算法下的节点有三个状态:随从、候选者 、领导
- 领导根据心跳时间给随从发送心跳(可能会附加日志,通过日志可以更新其他节点的数据),随从收到消息会回复领导 ,并将随从自己的自旋时间重置
- 随从如果接收不到领导者的消息会在随机自旋时间结束后成为候选者
- 候选者会让其他节点为自己投票选自己成为新一轮的领导(加上自己大多数同意即可)
raft算法下对系统的所有更改都要经过领导者
Raft 可以在面对网络分区时保持一致。
BASE 理论
BASE 理论是对 CAP 理论的延伸,思想是即使无法做到强一致性(CAP 的一致性就是强一致性),但可以采用适当的弱一致性,即最终一致性。
BASE 是指
-
基本可用(Basically Available)
- 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性(例如响应时间、 功能上的可用性),允许损失部分可用性。需要注意的是,基本可用绝不等价于系 统不可用。
- 响应时间上的损失:正常情况下搜索引擎需要在 0.5 秒之内返回给用户相应的 查询结果,但由于出现故障(比如系统部分机房发生断电或断网故障),我 们就得去查其他节点,导致查询 结果的响应时间增加到了 1~2 秒。
- 功能上的损失:购物网站在购物高峰(如双十一)时,为了保护系统的稳定性, 部分消费者可能会被引导到一个降级页面。
-
软状态( Soft State)
- 软状态是指允许系统存在中间状态(成功状态、中间状态、失败状态),而该中间状态不会影响系统整体可用性。
- 分布 式存储中一般一份数据会有多个副本,允许不同副本同步的延时就是软状态的体现。mysql replication 的异步复制也是一种体现。
-
最终一致性( Eventual Consistency)
- 最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。
- 弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
强一致性、弱一致性、最终一致性
从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。
对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。
如果能容忍后续的部分或者全部访问不到,则是弱一致性。
如果经过一段时间后要求 能访问到更新后的数据,则是最终一致性
分布式事务几种方案
2PC 模式
数据库支持的 2PC【2 phase commit 二阶提交】,又叫做 XA Transactions。
MySQL 从 5.5 版本开始支持,SQL Server 2005 开始支持,Oracle 7 开始支持。
其中,XA 是一个两阶段提交协议,该协议分为以下两个阶段:
- 第一阶段:事务协调器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是 否可以提交.
- 第二阶段:事务协调器要求每个数据库提交数据。
其中,如果有任何一个数据库否决此次提交,那么所有数据库都会被要求回滚它们在此事务 中的那部分信息。
XA的特点:
-
刚性事务
-
XA 协议比较简单,而且一旦商业数据库实现了 XA 协议,使用分布式事务的成本也比较 低。
-
XA 性能不理想,特别是在交易下单链路,往往并发量很高,XA 无法满足高并发场景
-
XA 目前在商业数据库支持的比较理想,在 mysql 数据库中支持的不太理想,mysql 的 XA 实现,没有记录 prepare 阶段日志,主备切换回导致主库与备库数据不一致。
-
许多 nosql 也没有支持 XA,这让 XA 的应用场景变得非常狭隘。
-
也有 3PC,引入了超时机制(无论协调者还是参与者,在向对方发送请求后,若长时间 未收到回应则做出相应处理)
柔性事务-TCC 事务补偿型方案
- 刚性事务:遵循 ACID 原则,强一致性。
- 柔性事务:遵循 BASE 理论,最终一致性;
与刚性事务不同,柔性事务允许一定时间内,不同节点的数据不一致,但要求最终一致。
一段业务代码分为三个方法: try(prepare)、confirm(commit)、 cancel(rollback)
- 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
- 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
- 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
柔性事务-最大努力通知型方案
按规律进行通知,不保证数据一定能通知成功,但会提供可查询操作接口进行核对。
这种 方案主要用在与第三方系统通讯时,比如:调用微信或支付宝支付后的支付结果通知。
这种 方案也是结合 MQ 进行实现,例如:通过 MQ 发送 http 请求,设置最大通知次数。达到通 知次数后即不再通知。
案例:银行通知、商户通知等(各大交易业务平台间的商户通知:多次通知、查询校对、对 账文件),支付宝的支付成功异步回调
柔性事务-可靠消息+最终一致性方案(异步确保型)
发送端防止消息丢失:
- 做好消息确认机制(publisher,consumer【手动ack】)
- 每一个发送的消息都在数据库做好记录。定期将失败的消息再次发送一遍
消费者:
- 开启手动ACK
- 将消费者的业务消费接口设计为幂等的,比如要解锁库存先判断状态
分布式事务—Seata
https://seata.apache.org/zh-cn/docs/overview/terminology/
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
整合Seata
https://seata.apache.org/zh-cn/docs/user/quickstart/
每一个微服务先必须创建 undo_log 表;
CREATE TABLE IF NOT EXISTS `undo_log`
(`branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',`xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);
导入依赖 spring-cloud-starter-alibaba-seata ;
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
安装事务协调器;seata-server(seata-all-0.7.1,所以该项目使用seata-server-0.7.1.zip): https://github.com/seata/seata/releases
解压seata-server,修改注册中心配置registry.conf,并启动seata-server
registry {type = "nacos"nacos {serverAddr = "localhost:8848"...}}
所有想要用到分布式事务的微服务使用seata的DataSourceProxy代理自己的数据源
@Configuration
public class MySeataConfig {@AutowiredDataSourceProperties dataSourceProperties;@Beanpublic DataSource dataSource(DataSourceProperties dataSourceProperties){HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();if (StringUtils.hasText(dataSourceProperties.getName())) {dataSource.setPoolName(dataSourceProperties.getName());}return new DataSourceProxy(dataSource);}}
每个微服务,都必须把seata-server-0.7.1/conf目录下的registry.conf、file.conf这两个文件拷贝到自己的resources目录下,然后修改自己微服务下的file.conf:
vgroup_mapping.{application.name}-fescar-service-group = "default"
比如订单服务:
vgroup_mapping.gulimall-order-fescar-service-group = "default"
给分布式大事务的入口标注@GlobalTransactional
,,每一个远程的小事务用@Transactional
@GlobalTransactional
// @Transactional@Overridepublic SubmitOrderResponseVo submitOrder(OrderSubmitVo vo) {//1、创建订单,订单项等信息OrderCreateTo order = createOrder();// 3、保存订单saveOrder(order);//4、库存锁定。只要有异常回滚订单数据。// 库存锁定需要的数据:订单号,所有订单项(skuId,skuName,num)//4、远程锁库存R r = wareFeignService.orderLockStock(getLockVo(order));//TODO 问题1:库存调用成功了,但是网络原因,或者其他原因,导致Feign调用超时了,此时:订单回滚,库存不会回滚。if (r.getCode() == 0) {//锁成功了response.setOrder(order.getOrder());//TODO 问题2:假如还有个远程扣减积分服务// 该服务出异常 :订单会回滚;由于库存服务已经成功的远程执行,不会回滚。int i = 10/0; //模拟扣减积分出异常} }
/*** 为某个订单锁定库存** @Transactional(rollbackFor = NoStockException.class)* 默认只要是运行时异常都会回滚*/@Transactional@Overridepublic Boolean orderLockStock(WareSkuLockVo vo) {//TODO 按照下单的收货地址,找到一个就近仓库,锁定库存。//1、找到每个商品在哪个仓库都有库存List<OrderItemVo> locks = vo.getLocks();
启动测试分布式事务
参考
雷丰阳: Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目.
本文完,感谢您的关注支持!
相关文章:
【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】
持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】 本地事务事务的基本性质事务的隔离级别(下面四个越往下,隔离级 别越高,并发能力越差)事务的传播行为(是否…...
HC05主从一体蓝牙模块的裸机使用——单片机<-->蓝牙模块
HC-05是一种常用的蓝牙模块,具有低功耗、低成本、易于使用的特点。它可以实现与其他蓝牙设备(如手机、电脑等)进行无线通信。HC-05蓝牙模块具有串口通信接口,可以通过串口与主控制器(如Arduino、Raspberry Pi等&#x…...
“点点通“餐饮点餐小程序-计算机毕业设计源码11264
"点点通"餐饮点餐小程序 XXX专业XX级XX班:XXX 指导教师:XXX 摘要 随着中国经济的飞速增长,消费者的智能化水平不断提高,许多智能手机和相关的软件正在得到更多的关注和支持。其中,微信的餐饮点餐小程序更…...
C#知识|账号管理系统-账号信息管理界面[1]:账号分类选择框、Panel面板设置
哈喽,你好啊,我是雷工! 前一节实现了多条件查询后端代码的编写, 接下来继续学习账号信息管理界面的功能编写,本节主要记录账号分类选择框和Panel的设置, 以下为学习笔记。 01 功能说明 本节实现以下功能: ①:账号分类选择框只能选择,无法自由输入; ②:账号分类框默认…...
Meta即将推出4000亿的Llama 3 超级AI模型,或将改写大语言模型竞争格局!|TodayAI
2024年4月,科技巨头Meta发布了其最新的AI大型语言模型——Llama 3,该模型基于一个至少比前代产品Llama 2大七倍的数据集,展现出前所未有的性能。在最初发布时,Llama 3提供了8B和70B两种参数规模的版本,并迅速超越了Goo…...
数据挖掘新技能:Python爬虫编程指南
Python爬虫的优势 Python之所以成为数据爬取的首选语言,主要得益于其丰富的库和框架支持。以下是一些常用的库: Requests:用于发送HTTP请求,简单易用,是Python爬虫的基础库。BeautifulSoup:用于解析HTML文…...
object-C 解答算法:移动零(leetCode-283)
移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…...
靖江美食元宇宙
关于“靖江美食元宇宙”的具体信息,搜索结果中并未提供直接相关的详细描述。不过,搜索结果显示了有关元宇宙在食品领域的应用和探索,例如食品元宇宙的概念、不同品牌尝试进入元宇宙市场的例子等。这些信息表明,元宇宙技术正在被用…...
模板方法设计模式
模板方法设计模式: 模板方法设计模式:解决方法中存在重复代码的问题。 模板方法设计模式的写法: 1、定义一个抽象类 2、在里面定义2个方法 一个是模板方法:把相同代码放里面去 一个是抽象方法:具体实现交给子类完成 建议使用…...
对象存储解决方案:高性能分布式对象存储系统MinIO
文章目录 引言I 自动化数据管理界面1.1 图形用户界面:GUI1.2 命令行界面:MinIO CLI1.3 应用程序编程接口:MinIO APIII 部署集成2.1 建议使用RPM或DEB安装方式2.2 创建环境变量文件2.3 启动MinIO服务2.4 将NGINX用作反向代理,配置负载。III 基础概念3.1 为什么是对象存储?3…...
2024 年需要考虑的 16 个知识库趋势和统计数据
自2017年以来,千禧一代已成为全球人口最多的一代。如果您的企业还没有准备好应对这一变化带来的挑战,那么是时候加快这一进程了。 毫不奇怪,千禧一代痴迷于智能手机和技术。他们具有流动性,期望与他们互动的品牌能够即时高效。 …...
微信小程序-实现跳转链接并拼接参数(URL拼接路径参数)
第一种常用拼接方法:普通传值的拼接 //普通传值的拼接checkRouteBinttap: function (e) {wx.navigateTo({url: ../checkRoute/checkRoute?classId this.data.classInfo.classId "&taskId" this.data.classInfo.taskId,})}第二种:拼接…...
【代码随想录|第十一章 图论part01 | 797.所有可能的路径 】
代码随想录|第十一章 图论part01 | 图论理论基础,797.所有可能的路径,广搜理论基础 一、图论理论基础1.图的基本概念2.图的构造1)邻接矩阵2)邻接表 3.图的遍历方式4.深度优先搜索理论基础 二、797.所有可能的路径1.核心代码2.问题…...
尚硅谷大数据技术-数据湖Hudi视频教程-笔记03【Hudi集成Spark】
大数据新风口:Hudi数据湖(尚硅谷&Apache Hudi联合出品) B站直达:https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘:https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…...
【python】Pandas中IndexError: single positional indexer is out of bounds的报错分析
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
ubuntu上通过修改grub启动参数,将串口重定向到sol
要修改 GRUB 启动参数以实现串口重定向到 Serial Over LAN (SOL),你需要编辑 /etc/default/grub 文件,并更新 GRUB 配置。这里是详细步骤: 1. 编辑 /etc/default/grub 打开终端并使用文本编辑器(如 nano 或 vim)编辑…...
【Git】(基础篇四)—— GitHub使用
GitHub使用 经过上一篇的文章,相信大家已经对git的基本操作熟悉了,但哪些使用git的方法只是在本地仓库进行,本文介绍如何使用git和远程仓库进行连接使用。 Github和Gitee 主要用到的两个远程仓库在线平台是github和gitee GitHub GitHub …...
【Qt+opencv】基础的图像绘制
文章目录 前言line函数ellipse函数rectangle函数circle函数fillPoly函数putText函数总结 前言 在计算机视觉和图像处理领域,OpenCV是一个强大的库,提供了丰富的功能和算法。而Qt是一个跨平台的C图形用户界面应用程序开发框架,它为开发者提供…...
使用Nginx OpenResty与Redis实现高效IP黑白名单管理
1、引言 在当今数字化时代,网络安全已成为企业和个人用户关注的焦点。IP黑白名单作为一种有效的网络安全策略,允许我们精确控制对Web资源的访问权限。通过白名单,我们可以确保只有可信的IP地址能够访问敏感资源;而黑名单则可以阻…...
EasyExcel导入导出数据类型转换
前言: 1、基本数据类型转换:当前原始的数据类型是interger类型,需要在导出时将其映射为对应的字符串,并且导入时可以将字符串重新映射为interger类型。 2、时间格式转换:数据从数据库中获取的类型为LocalDate类型&…...
stm32入门-----EXTI外部中断(下——实践篇)
目录 前言 一、硬件介绍 1.对射红外线传感器 2.旋转编码器 二、EXTI外部中断C编程 1.开启RCC时钟 2.配置GPIOK口初始化 3.配置AFIO 4.配置EXIT 5.配置NVIC 三、EXIT外部中断项目实操 1.对射红外传感器计数 2.选择编码器计数 前言 本期接着上一期的内容继续学习stm3…...
深度学习落地实战:基于UNet实现血管瘤超声图像分割
前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...
Python进阶(4)--正则表达式
正则表达式 在Python中,正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前,还记得之前我们是通过什么方法分割…...
RCA连接器是什么?一文读懂
RCA连接器,也就是我们在电视机、DVD播放器、通讯设备、立体声设备和游戏设备后面常见的彩色插头,其历史可以追溯到近一个世纪以前。这种现今广泛使用的电缆接口,最初是由美国无线电公司(RCA)开发并命名的,在…...
【linux】服务器安装NVIDIA驱动
【linux】服务器安装NVIDIA驱动 【创作不易,求点赞关注收藏】😀 文章目录 【linux】服务器安装NVIDIA驱动一、关闭系统自带驱动nouveau二、下载英伟达驱动三、安装英伟达驱动1、禁用X服务器和相关进程2、在TTY终端安装驱动3、验证是否安装成功4、重新启…...
【达梦数据库】关于用户、模式、表空间等如何理解?
与MySQL的用户有所区别,MySQL是单实例多库,DM7以上版本是单库多实例架构, MySQL访问方式: 一个root访问多个库,访问前切换一下就ok 比如MySQL到DM的迁移是,MySQL的一个库对应dm中的一个表空间和一个用户。比…...
一篇就够mysql高阶知识总结
一、事务的ACID原则 序号原则说明1原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做2一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一…...
CTF-Web习题:[BJDCTF2020]ZJCTF,不过如此
题目链接:[BJDCTF2020]ZJCTF,不过如此 解题思路 访问靶场链接,出现的是一段php源码,接下来做一下代码审阅,发现这是一道涉及文件包含的题 主要PHP代码语义: file_get_contents($text,r); 把$text变量所…...
【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)
第四届能源工程与电力系统国际学术会议(EEPS 2024) 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网:www.iceeps.com 大会时间:2024年8月9-11日 大会…...
浅谈Vue:text-align: center、align-items: center、justify-content: center三种居中的区别和用法
text-align: center、align-items: center 和 justify-content: center 是用于不同布局场景下的CSS属性。它们在水平和垂直居中元素方面有所不同,具体取决于你使用的布局模型(如块级元素、Flexbox、Grid)。以下是它们的区别和适用场景&#x…...
安徽政府网站建设/百度竞价推广点击软件
经典面试题:链表的相交与环问题 点击打开链接 http://blog.csdn.net/hackbuteer1/article/details/7583102 c语言面试精华版 点击打开链接 http://blog.csdn.net/hackbuteer1/article/details/6550824...
珠海在线网站建设/seo公司培训课程
哈喽大家好,我是无知便是罪,专注于收集和分享互联网上不为人知的好东西!文件传输想必大家经常会用到,但是使用场景不同选择也不同!像平常的小文件通过某些社交软件即可在手机与电脑之间快速传输。不过它们限制了文件大…...
怎样做某个网站有更新的提醒/官网seo优化找哪家做
TP5字段值加1 原始的办法setInc && setDec原始的办法 // 先查询原本的数值$num db(table)->where(id, 1)->value(num);// 再将数值1 update回去db(table)->update([id>1, num>$num1]);setInc && setDec // 直接使用 setInc 或 setDecdb(table…...
二级建造师考试试题/整站优化的公司
refs: http://blog.chinaunix.net/uid-26404201-id-3334234.html 先看下面的Makefile: #exampleB : $(A)A laterall: echo $(B) 执行make命令,我们发现什么都没输出,我们将第3行的:换成。#exampleB $(A)A laterall: echo $(B) 执行make&#x…...
自己弄网站怎么弄/seo优化排名软件
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi n filename :打开文件,并将光标置于第n行首 vi filename :打开文件,并将光标置于最后一行首 vi /pattern filename:打开文件&…...
建设路84号 网站备案/网站死链检测工具
在javascript中数据类型的转换分为两种,一种是隐式类型转换,还有一种是强制转换,下面来简单介绍下这两种数据类型的转换。 - 隐式类型转换 在没有特意指定类型来进行数据转换的都是隐式类型转换,以下的三种情况都是属于隐式类…...