【分布式微服务云原生】掌握Java分布式事务:2PC、3PC、TCC与Seata全解析

目录

  • 掌握Java分布式事务:2PC、3PC、TCC与Seata全解析
  • 一、分布式事务的由来
  • 二、两阶段提交2PC
    • 1. **准备阶段(投票阶段)**
    • 2. **提交阶段**
    • 3.**优缺点**
      • 优点:
      • 缺点:
  • 三、三阶段提交3PC
    • 1. 准备阶段(Prepare Phase)
    • 2. 预提交阶段(Pre-Commit Phase)
    • 3. 提交阶段(Commit Phase)
    • 4. 中断阶段(Abort Phase)
    • 5.举例说明三阶段提交的每个阶段,参与者具体做了啥
      • 事务内容
      • 准备阶段(Prepare Phase)
      • 预提交阶段(Pre-Commit Phase)
      • 提交阶段(Commit Phase)
      • 中断阶段(Abort Phase)
    • 6.三阶段提交啥情况下会出现事务不一致,举例生动形象的详细描述
      • 事务不一致的情况
      • 生动形象的例子
  • 四、TCC(Try-Confirm-Cancel)
      • 1、实现步骤
      • 2、示例:假设一个电子商务平台需要处理一个跨多个服务的订单,涉及库存服务、账户服务和订单服务。
        • 库存服务(节点1)- Try: 检查商品库存是否足够。- Confirm: 减少库存数量。- Cancel: 如果事务失败,增加库存数量以回滚。
        • 账户服务(节点2)- Try: 检查用户账户余额是否足够。- Confirm: 从用户账户扣除相应金额。- Cancel: 如果事务失败,将扣除的金额加回用户账户。
        • 订单服务(节点3)- Try: 记录订单详情,但不提交数据库事务。- Confirm: 提交订单数据库事务,更新订单状态为已支付。- Cancel: 如果事务失败,删除未完成的订单记录。
      • 3、TCC分布式事务流程
      • 4、一致性保障
      • 5、注意事项
      • 6、TCC为啥要求所有操作都是幂等的?举个形象生动的例子说明下
        • 1、幂等性的定义
        • 2、为什么需要幂等性
        • 3、生动的例子
  • 五、Seata几种模式的区别

掌握Java分布式事务:2PC、3PC、TCC与Seata全解析

摘要:
在现代互联网应用中,分布式事务是确保数据一致性的关键技术。本文深入探讨了分布式事务的核心技术,包括两阶段提交(2PC)、三阶段提交(3PC)、TCC(Try-Confirm-Cancel)以及Seata。读者将能够理解这些技术的原理、优缺点以及在实际项目中的应用。

关键词:
分布式事务,2PC,3PC,TCC,Seata,AT模式,Saga模式,Java,微服务,数据一致性


一、分布式事务的由来

随着互联网技术的发展与数据体量的扩增,软件系统逐渐由单体应用演变为分布式系统/微服务应用。
分布式系统把一个单体应用系统拆分成可独立部署的多个微服务,很多场景下需要服务之间远程协作才能完成事务操作。
这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务。
分布式系统中实现事务,其实是由多个本地事务组合而成。对于分布式事务而言几乎满足不了 ACID。

二、两阶段提交2PC

在两阶段提交(2PC)中,参与者在准备阶段开始执行事务操作,但不会立即提交事务。两阶段提交的详细步骤如下:

1. 准备阶段(投票阶段)

  • 事务协调者向所有参与者发送准备请求(prepare请求),询问它们是否准备好提交自己的事务部分。
  • 参与者收到准备请求后,会执行所有必要的事务操作,例如更新数据、锁定资源,但不会提交事务。
  • 参与者将操作结果写入到持久性日志中,以便在系统崩溃时可以恢复状态。
  • 然后,参与者向协调者回复一个投票结果,通常是“同意”或“拒绝”。如果参与者无法提交事务,比如违反了某些业务规则或资源锁定失败,则投票为“拒绝”。

2. 提交阶段

  • 协调者根据所有参与者的投票结果做出决策。如果所有参与者都投票“同意”,则进入提交事务;如果任何一个参与者投票“拒绝”,则协调者决定回滚事务。
  • 协调者向所有参与者发送提交(commit)或回滚(rollback)的指令。
  • 参与者根据协调者的指令执行最终的提交或回滚操作,并释放所有锁定的资源。

3.优缺点

这种机制确保了所有参与者在最终提交之前都已经准备好了,从而维护了事务的原子性和一致性。
然而,这也意味着在准备阶段,参与者需要锁定涉及的所有资源,这可能导致资源的长时间锁定,从而影响系统并发性能。如果协调者在提交阶段失败,且没有适当的恢复机制,可能会导致某些参与者处于不确定状态,这是两阶段提交的一个缺点。

优点:

原子性:确保所有参与者要么全部提交,要么全部回滚,满足ACID属性中的原子性。
原因:集中式决策提高了事务的一致性。
例子:银行转账,两个账户的扣款和存款必须同时成功或失败。

缺点:

性能问题:所有参与者在准备阶段需要等待协调者的指令,造成延迟。
单点故障:协调者故障可能导致整个事务失败。
原因:协调者是单点,对系统稳定性要求高。
例子:如果协调者在提交阶段宕机,所有参与者可能无法及时得知提交或回滚的指令。"

三、三阶段提交3PC

三阶段提交3PC 在2PC的基础上增加了一个预提交阶段,以解决协调者故障时参与者的阻塞问题。
三阶段提交协议(3PC,Three-Phase Commit Protocol)是一种用于确保分布式系统中所有节点对某个操作达成一致的协议。它主要用于数据库事务管理,尤其是在分布式数据库系统中。三阶段提交协议分为以下三个阶段

1. 准备阶段(Prepare Phase)

在这个阶段,协调者(Coordinator)向所有参与者(Participants)发送准备请求(prepare message),询问它们是否准备好提交事务。参与者收到请求后,会执行所有事务操作,但不会提交,而是进入一个预提交状态。如果参与者能够提交事务,则向协调者回复一个肯定的准备响应(prepared response),表示它已经准备好提交事务。如果参与者无法提交事务,则发送否定的准备响应。

2. 预提交阶段(Pre-Commit Phase)

一旦协调者从所有参与者那里收到肯定的准备响应,它将进入预提交阶段。在这个阶段,协调者向所有参与者发送预提交请求(pre-commit message),指示它们提交事务。如果协调者收到任何否定的准备响应,它将进入中断阶段(abort phase)。
参与者在收到预提交请求后,会执行实际的提交操作,并将事务结果写入持久存储。然后,参与者向协调者发送一个预提交确认(acknowledgment),表示事务已经提交。

3. 提交阶段(Commit Phase)

在这个阶段,协调者等待所有参与者的预提交确认。一旦收到所有确认,协调者将向所有参与者发送提交请求(commit message),正式通知它们提交事务。如果协调者在预提交阶段收到否定的预提交响应,或者在提交阶段等待超时,它将进入中断阶段。
参与者在收到提交请求后,会将事务的最终状态写入持久存储,并释放所有事务资源。

4. 中断阶段(Abort Phase)

如果协调者在任何阶段收到否定的响应,或者在等待响应时超时,它将进入中断阶段。在这个阶段,协调者向所有参与者发送中断请求(abort message),指示它们回滚事务。参与者在收到中断请求后,将回滚所有事务操作,并释放事务资源。
三阶段提交协议通过这些阶段确保了分布式系统中的事务一致性,即使在网络分区或其他故障情况下也能保持数据的完整性。然而,它也引入了额外的复杂性和通信开销。

5.举例说明三阶段提交的每个阶段,参与者具体做了啥

让我们通过一个简单的SQL事务来说明三阶段提交协议中参与者的行为假设我们有一个分布式数据库系统,其中有两个节点,A和B。我们想要执行一个事务,该事务涉及到在两个节点上同时更新数据。

事务内容

  • 在节点A上,将账户1的余额减少100元。
  • 在节点B上,将账户2的余额增加100元。

准备阶段(Prepare Phase)

  1. 协调者参与者A和B发送准备请求。
  2. 参与者A检查账户1的余额是否足够,锁定账户1,准备扣除100元,但不实际进行扣款,记录这个操作到事务日志中。
  3. 参与者B检查账户2是否可以增加100元,锁定账户2,准备增加100元,但不实际进行增加,记录这个操作到事务日志中。
  4. 参与者A和B协调者发送肯定的准备响应,表示它们已经准备好提交这部分事务。

预提交阶段(Pre-Commit Phase)

  1. 协调者收到所有参与者的肯定准备响应后,向参与者A和B发送预提交请求。
  2. 参与者A将账户1的扣款操作实际执行,但仍然保持锁定状态,确保操作的原子性。
  3. 参与者B将账户2的加款操作实际执行,同样保持锁定状态。
  4. 参与者A和B协调者发送预提交确认,表示它们已经执行了事务操作,等待最终提交。

提交阶段(Commit Phase)

  1. 协调者收到所有参与者的预提交确认后,向参与者A和B发送提交请求。
  2. 参与者A接收到提交请求,正式提交事务,释放对账户1的锁定,确保其他操作可以访问账户1。
  3. 参与者B接收到提交请求,正式提交事务,释放对账户2的锁定。
  4. 参与者A和B完成事务的所有后续工作,如清理事务日志,更新数据库状态等。

中断阶段(Abort Phase)

如果在任何阶段,协调者收到否定的响应,或者在等待响应时超时,协调者将进入中断阶段,向所有参与者发送中断请求,参与者将回滚事务,释放所有资源。
通过这个示例,我们可以看到:

  • 在准备阶段,参与者并没有实际修改数据,只是做了修改的准备。
  • 在预提交阶段,参与者实际执行了修改操作,但仍然保持锁定状态。
  • 在提交阶段,参与者完成了事务的最终提交,并释放了所有资源。
    这样,即使在分布式系统中,事务的一致性和原子性也得到了保证。

6.三阶段提交啥情况下会出现事务不一致,举例生动形象的详细描述

三阶段提交(3PC)协议是分布式事务处理中用来保证事务的原子性和一致性的一个协议。它在两阶段提交(2PC)的基础上增加了一个预提交阶段,以减少阻塞并提供超时机制。尽管3PC提供了一些改进,但在某些情况下仍然可能出现事务不一致的问题。

事务不一致的情况

  1. *网络波动或超时导致的消息丢失
  • 假设我们有三个参与者A、B和C,它们都参与了一个分布式事务。事务协调者是D。
  • 在预提交阶段,协调者D向A、B、C发送预提交请求,并等待它们的确认。
  • 如果A和B收到了预提交请求并确认,但C由于网络问题没有收到预提交请求,此时D可能会因为超时而决定中断事务。
  • 然而,如果A和B在超时后决定提交事务(因为它们认为预提交已经成功),而C由于没有收到预提交请求而没有提交,这就导致了事务的不一致。
  1. *协调者故障
  • 在预提交阶段,如果协调者D在发送预提交请求后但在收到所有确认之前发生故障,那么参与者A、B、C将无法确定是否应该提交事务。
  • 如果D在故障前已经向A发送了预提交请求,A可能会决定提交事务,而B和C可能因为未收到预提交请求而保持等待或回滚,这同样会导致不一致。
  1. *参与者故障
  • 如果在预提交阶段,参与者A在收到预提交请求后但在发送确认之前发生故障,协调者D可能无法确定A的状态。
  • 如果D决定继续提交事务,而A实际上由于故障而无法提交,这将导致不一致。

生动形象的例子

想象一下,你和你的朋友们正在计划一个聚会。这个聚会的成功需要三个关键因素:你(参与者A)、你的朋友甲(参与者B)和你的朋友乙(参与者C)的同意和参与。

  • 第一阶段(准备阶段): 你作为组织者,打电话给甲和乙,询问他们是否愿意参加聚会。这相当于协调者询问参与者是否准备好。
  • 第二阶段(预提交阶段): 甲和乙都表示愿意参加,但你在联系乙的时候电话突然断线了,你不确定乙是否收到了你的信息。这相当于协调者在发送预提交请求后无法确认所有参与者的状态。
  • 第三阶段(提交阶段): 由于你不确定乙的情况,你决定等待一段时间再做决定。如果甲在等待期间误以为聚会已经确定,开始准备,而乙因为没有收到最终确认而没有准备,那么聚会的计划就会出现混乱,这就像分布式事务中的不一致。
    在这个例子中,如果最终你决定取消聚会,但甲已经开始了准备,这就相当于分布式事务中的不一致状态。3PC协议通过增加超时机制和预提交阶段来减少这种情况的发生,但在网络问题或系统故障的情况下,仍然可能面临事务不一致的风险。"

四、TCC(Try-Confirm-Cancel)

TCC(Try-Confirm-Cancel)通过在分布式系统中的不同节点上执行预检、确认和取消三个阶段的操作来实现事务的一致性。以下是TCC实现分布式事务一致性的具体步骤和示例

1、实现步骤

  1. Try阶段 - 在所有参与分布式事务的节点上执行业务逻辑的预检查,如资源检查和预留。 - 所有节点的Try操作必须成功,事务才能继续进行。
  2. Confirm阶段 - 如果所有Try操作成功,所有节点将执行实际的业务操作,如数据库更新,以提交事务。 - 所有节点的Confirm操作必须成功,以确保事务的一致性。
  3. Cancel阶段 - 如果任何一个节点的Try操作失败,所有节点将执行取消操作,回滚所有已经执行的Try阶段的操作,释放预留的资源。

2、示例:假设一个电子商务平台需要处理一个跨多个服务的订单,涉及库存服务、账户服务和订单服务。

库存服务(节点1)- Try: 检查商品库存是否足够。- Confirm: 减少库存数量。- Cancel: 如果事务失败,增加库存数量以回滚。
账户服务(节点2)- Try: 检查用户账户余额是否足够。- Confirm: 从用户账户扣除相应金额。- Cancel: 如果事务失败,将扣除的金额加回用户账户。
订单服务(节点3)- Try: 记录订单详情,但不提交数据库事务。- Confirm: 提交订单数据库事务,更新订单状态为已支付。- Cancel: 如果事务失败,删除未完成的订单记录。

3、TCC分布式事务流程

  1. 发起事务
  • 用户发起购买请求,订单服务开始一个分布式事务。
  1. Try阶段
  • 订单服务向库存服务发送Try请求,检查库存。
  • 同时向账户服务发送Try请求,检查账户余额。
  • 两个服务执行Try操作并返回结果。
  1. 判断Try结果
  • 如果库存和账户余额都足够,订单服务记录订单详情但不提交数据库事务。
  1. Confirm阶段
  • 订单服务向库存服务发送Confirm请求,库存服务减少库存并提交事务。
  • 向账户服务发送Confirm请求,账户服务扣除金额并提交事务。
  • 订单服务提交订单数据库事务,更新订单状态。
  1. 事务提交 - 所有服务的Confirm操作成功,分布式事务完成。
  2. 异常处理
  • 如果任何一个Try操作失败,订单服务将向所有服务发送Cancel请求。
  • 库存服务增加库存,账户服务加回金额,订单服务删除订单记录。

4、一致性保障

  • TCC模式通过在所有相关服务上执行Try操作来确保事务的预检查。
  • 只有所有Try操作都成功,才会进入Confirm阶段,否则进入Cancel阶段。
  • 通过这种机制,TCC确保了分布式事务的一致性,即使在网络分区或服务故障的情况下也能保持数据的一致状态。

5、注意事项

  • TCC要求所有操作都是幂等的,以确保在重试或回滚时不会影响系统状态。
  • 在实际应用中,可能需要引入事务协调器来管理Try、Confirm和Cancel的流程。
  • 需要考虑超时机制和幂等性保证,以处理网络延迟或服务故障。"

6、TCC为啥要求所有操作都是幂等的?举个形象生动的例子说明下

TCC(Try-Confirm-Cancel)要求所有操作都是幂等的,主要是因为在分布式系统中,网络通信和远程服务调用存在不确定性,如网络延迟、服务故障等,这可能导致事务的某个阶段被重复执行。
如果操作不是幂等的,那么重复执行相同的操作可能会导致数据不一致或系统状态错误。

1、幂等性的定义

幂等性意味着无论操作被执行一次还是多次,其结果都是相同的。在分布式事务中,这保证了即使在失败和重试的情况下,系统状态也不会受到影响。

2、为什么需要幂等性
  1. 保证数据一致性:在分布式系统中,如果一个操作因为网络问题被重复发送或执行,幂等性可以确保这些重复操作不会对数据产生副作用。
  2. 容错性:在发生故障时,系统可能需要重试操作。幂等性确保重试不会破坏事务的一致性。
  3. 简化设计:幂等性简化了分布式事务的设计,因为它减少了需要处理的异常情况。
3、生动的例子

想象一下你在餐厅点餐的场景

  • Try阶段:你告诉服务员你想点的菜品(““我想点一份宫保鸡丁””)。服务员检查菜单并确认菜品可用,但还没有下单到厨房。
  • Confirm阶段:如果服务员确认了你的订单,他会将你的点餐信息正式发送到厨房(““宫保鸡丁一份,下单到厨房””)。厨房开始准备你的菜品。
  • Cancel阶段:如果服务员发现宫保鸡丁已经售罄,他会告诉你无法提供这道菜,并取消之前的点餐尝试。
    现在,假设因为餐厅内通讯设备问题,你的点餐信息被重复发送了两次到厨房- 幂等性重要性:由于点餐操作是幂等的,即使厨房收到了两次相同的点餐信息,他们也会意识到这是同一个订单,只会为你准备一份宫保鸡丁,而不是两份。这样,即使你的点餐信息被重复发送,你也不会因此得到多份菜品,保证了你的订单数据一致性。
    如果没有幂等性,可能会出现以下情况- 服务员重复告诉厨房你的点餐信息,导致厨房为你准备了多份宫保鸡丁,这不仅造成了食材的浪费,也给你造成了困扰(比如需要支付更多的费用)。
    在分布式系统中,幂等性确保了即使在通信不可靠的情况下,每个节点的状态也能保持一致,避免了因重复操作导致的数据错误或资源浪费。"

五、Seata几种模式的区别

Seata 提供了几种分布式事务解决方案,如 XA模式、AT 模式、TCC 模式和 Saga 模式)有以下主要区别:

  1. XA 模式: XA 模式基于 XA 规范实现的分布式事务,它依赖于关系型数据库的本地事务支持 XA。 XA 模式的事务具有强一致性,满足 ACID 原则,但性能较差,因为一阶段需要锁定数据库资源,等待二阶段结束才释放。
  2. AT 模式: AT 模式是一种无侵入的分布式事务解决方案。用户只需要关注业务 SQL,Seata 框架会自动处理事务的二阶段提交和回滚操作。
  • 在一阶段,Seata 会拦截业务 SQL,解析 SQL 语义,找到要更新的业务数据,并保存快照(before image 和 after image),然后执行 SQL 更新数据,并生成行锁,整个过程在一个数据库事务内完成,确保原子性。
  • 在二阶段提交时,Seata 只需删除一阶段保存的快照数据和行锁,完成数据清理。 在二阶段回滚时,Seata 会使用 before image 来还原业务数据,并校验脏写。
  1. TCC 模式:Cancel)需要用户根据自己的业务场景实现 Try、Confirm 和 Cancel 三个操作。 用户在一阶段执行 Try 操作进行资源检测和预留,在二阶段提交时执行 Confirm 操作,在二阶段回滚时执行 Cancel 操作释放资源。
  2. Saga 模式: Saga 模式适用于长事务处理,它通过服务编排,将一个长事务拆分成多个本地事务,并由一系列的补偿操作来保证事务的最终一致性。 Saga 模式不依赖于数据库的本地事务,适用于业务流程长且需要保证事务最终一致性的业务系统。
    每种模式都有其适用场景,AT 模式适用于不希望对业务进行改造的场景,几乎 0 学习成本,而 TCC 模式适用于对性能有高要求的场景,Saga 模式适用于业务流程长且需要保证事务最终一致性的系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442586.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识图谱入门——11:构建动态图谱渲染应用:Vue3与Neo4j的集成与实践

在知识图谱与大数据技术领域,构建动态图谱是一项非常重要的任务。这篇博客将带你深入了解如何利用Vue.js、D3.js以及Neo4j,开发一个能够实时渲染图谱节点和关系的应用。我们将从零开始,介绍如何搭建开发环境、安装依赖、与Neo4j数据库交互、到…

考研笔记之操作系统(三)- 存储管理

操作系统(三)- 存储管理 1. 内存的基础知识1.1 存储单元与内存地址1.2 按字节编址和按字编址1.3 指令1.4 物理地址和逻辑地址1.5 从写程序到程序运行1.6 链接1.6.1 静态链接1.6.2 装入时动态链接1.6.3 运行时动态链接 1.7 装入1.7.1 概念1.7.2 绝对装入1…

分支预测器BPU

分支预测器BPU 0 Intro0.1 CPU执行过程0.2 分支预测0.2.1 TAGE预测器0.2.2 跳转地址 分支预测器BPU是深入研究一个高性能处理器的一个很好的开始项目; 0 Intro 条件分支是指后续具有两路可执行的分支。可以分为跳转分支(taken branch)和不跳转分支(not-taken branc…

ES创建文档,使用postman调用请求

请求的url 地址是http://192.168.1.108:9200/shopping/_doc,请求方式为post, 请求参数为: { "title":"小米手机", "category":"小米", "images":"http://www.gulixueyuan.com/xm.jpg", "price&…

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

目录 一、问题描述二、问题原因2.1 理论角度2.2 源码角度 三、解决方案解决方案①:StringBuilder 拼接解决方案②:读取文件内容 四、方案验证 在线文本换行工具: https://lzltool.cn/Toolkit/WrapWordsInText 一、问题描述 今天在开发过程中…

CPU、GPU、显卡

CPU VS GPUCPU(Central Processing Unit),中央处理器GPU(Graphics Processing Unit),图形处理单元GPU 的技术演变CUDA(Compute Unified Device Architecture) 显卡(Video…

016 规格参数

文章目录 新增AttrController.javaAttrVo.javaAttrServiceImpl.javaAttrAttrgroupRelationEntity.javaAttrEntity.javaAttrGroupEntity.java 查询AttrController.javaAttrServiceImpl.javaAttrRespVo.java 修改回显AttrController.javaAttrServiceImpl.java 修改提交AttrContro…

Word 插入表格的具体步骤图解

Word 是工作和学习中比较常用的软件之一,有时候在使用的过程中可能需要插入一个表格来整理一些数据,但是有的人可能不知道如何插入表格,下面就给大家总结了 Word 怎么插入表格。 Word 插入表格 Word 插入表格之后可以在里面填写数据和文本&…

时序约束进阶四:set_input_delay和set_output_delay详解

目录 一、前言 二、set_input_delay/set_output_delay 2.1 延时约束 2.2 约束设置界面 2.3 示例工程 2.4 Delay Value 2.5 Delay value is relative to clock edge 2.6 Delay value already includes latencies of the specified clock edge 2.7 Rise/Fall 2.8 Max/M…

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

使用IOT-Tree Server制作一个边缘计算设备(Arm Linux)

最近实现了一个小项目&#xff0c;现场有多个不同厂家的设备&#xff0c;用户需要对此进行简单的整合&#xff0c;并实现一些联动控制。 我使用了IOT-Tree Server这个软件轻松实现了&#xff0c;不外乎有如下过程&#xff1a; 1&#xff09;使用Modbus协议对接现有设备&#…

9-贪心算法

PDF文档下载&#xff1a;LeetCode-贪心算法-java 参考&#xff1a;代码随想录 题目分类大纲如下&#xff1a; 贪心算法理论基础 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心的套路&#xff08;什么时候用贪心&#xff…

C++ STL容器(五) —— priority_queue 底层剖析

这篇来讲下 priority_queue&#xff0c;其属于 STL 的容器适配器&#xff0c;容器适配器是在已有容器的基础上修改活泼限制某些数据接口以适应更特定的需求&#xff0c;比如 stack 栈使数据满足后进先出&#xff0c;queue 队列使数据满足先进先出&#xff0c;其都是在已有容器上…

转型AI产品经理需要掌握的硬知识、经理能力模型和常见AI概念梳理

近几年&#xff0c;从亚马逊&#xff0c; Facebook&#xff0c;到谷歌&#xff0c;微软&#xff0c;再到国内的BAT&#xff0c;全球最具影响力的技术公司都将目光转向了人工智能&#xff08; AI &#xff09;。2016年 AlphaGo 战胜李世石&#xff0c;把公众的目光也聚集到了人工…

哪些因素会影响PMC对生产质量问题的响应速度?

在制造业中&#xff0c;生产物料控制&#xff08;PMC&#xff09;扮演着至关重要的角色&#xff0c;它负责协调生产计划、物料采购、库存管理和生产进度等多个环节&#xff0c;确保生产活动能够顺利进行。然而&#xff0c;面对生产过程中可能出现的各种质量问题&#xff0c;PMC…

详解 PDF 转 JPG:简单操作,高效转换

如今&#xff0c;众多软件都已具备将PDF转换为JPG的功能&#xff0c;所以pdf怎么转换成jpg图片已经不难解决了吧。接下来&#xff0c;我想分享几款依然保存在我电脑中&#xff0c;且非常实用的PDF转JPG工具给大家。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn…

C语言基础之结构体

今天我们来讲讲C语言基础的最后一个知识点了 —— 结构体。不知道大家对前面的C语言基础的知识点掌握的怎么样了呢&#xff1f;下面我们就开始讲解结构体的相关知识点吧&#xff01; 什么是结构体呢&#xff1f;或者说结构体有什么作用呢&#xff1f;对于复杂对象来说&#xff…

盘点2024年4款打工人都在用的PDF软件。

PDF 软件在现代的办公或者是学习当中的应用非常广泛&#xff0c;已经成了很多人的必备工具。因为PDF 文件具有跨设备、跨系统的优势&#xff0c;所以在很多设备上都可以打开浏览。如果有了PDF 编辑软件&#xff0c;查看&#xff0c;编辑&#xff0c;分享也会变得更加方便简单&a…

四、Python基础语法(数据类型转换)

数据类型转换就是将一种类型的数据转换为另外一种类型的数据&#xff0c;数据类型转换不会改变原数据&#xff0c;是产生一个新的数据。 变量 要转换为的类型(原数据) -> num int(28) 一.int()将其他类型转换为整型 1.整数类型的字符串转换为整型 num1 28 print(type…

DAMA数据管理知识体系(第9章 文件和内容管理)

课本内容 9.1 引言 概要 文件和内容管理是指针对存储在关系型数据库之外的数据和信息的采集、存储、访问和使用过程的管理[1]。它的重点在于保持文件和其他非结构化或半结构化信息的完整性&#xff0c;并使这些信息能够被访问。业务驱动因素 法规遵从性要求 法律法规要求组织保…