问题标签 [two-phase-commit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
apache-flink - Flink 两阶段提交 map 函数实现完全一次语义
背景:
我们有一个 Flink 管道,它由多个源、多个接收器和管道沿线的多个运算符组成,这些运算符还更新数据库。
为了这个问题并使其更简单,让我们假设我们有一个看起来像这样的管道:
该管道应该允许我们收听有关某些数据更改的通知。(每个通知都包含一个 ID)对于每个通知,我们从数据库中读取数据,运行算法并更新相同的数据库行。之后,我们还发出数据变化的幅度。只有当数据变化幅度足够大时,我们才会向另一个 Kafka 主题发出通知。
- Source 订阅 Kafka 主题以侦听更改数据 ID 的通知。
- KeyBy 是通过 ID 键入的,以确保同一 ID 不会被 2 个操作员实例同时处理。
- 给定 ID,FlatMap 从 DB 读取数据,运行算法并更新相同的 DB 行。它发出变化幅度。它是 FlatMap 而不是 Map,因为在某些情况下,我们不想发出任何变化幅度,例如,如果我们有一些特定的错误。
- 过滤器过滤流的幅度小于某个阈值
- Sink 正在将过滤后的通知发送到另一个 Kafka 主题。
问题:
我们希望以一次性语义运行管道。从我们看到的情况来看,Flink 支持 Kafka 源、Kafka 接收器以及中间的有状态或有状态操作符的一次性语义。我们找不到任何地方解释如何使用您在管道中更新的资源执行一次。有一个TwoPhaseCommitSinkFunction允许创建一个允许完全一次语义的接收器函数。
我们不能使用它,因为我们想更新数据库,然后向 Kafka 发出更改通知。在 2 个单独的接收器中执行此操作将产生竞争条件,我们可以在数据库实际更新之前收到幅度通知。
我们错过了什么吗?有没有办法在 Map/FlatMap 运算符中实现 2 阶段提交?还有其他解决方案吗?
谢谢!
postgresql - 在 postgres 上使用两阶段提交
假设在“db1”中有一个名为“t1”的表,在“db2”中有一个名为“t2”的表,我需要在两个表上插入一条记录,否则失败。
连接到 db1 我想我应该输入这个
连接到 db2 我猜
如您所见,我不知道如何在 postgres 上使用两阶段提交。
TL;博士
我不知道如何在同一个 RDBMS 中的不同数据库上执行同步命令。
我在 postgres 官方文档中阅读过,为了在两个或多个不相关的 postgres 数据库中同步工作,我们可以使用所谓的“两阶段提交”协议的实现。
所以我开始尝试看看人们是如何在 postgres 中实际使用它们的,我没有看到任何实际的例子,最多我得到这篇文章,他试图用几个连接到不同数据库的 postgres 客户端进行试验模拟在 pararell 中运行的多个进程对应该以感激(所有提交)或可怕方式(所有回滚)结束的几个 dbs 做事。
我偷看的其他来源是:
- https://en.wikipedia.org/wiki/Two-phase_commit_protocol(这个来源很好地解释了协议,但真的让我想知道我的“协调员”在哪里或谁是我的“协调员”以及如何向“参与者”发送消息......我只有got
prepare transaction <id>
,commit prepared <id>
或rollback prepared <id>
我可以使用的命令) - 两阶段提交
- https://dba.stackexchange.com/questions/145656/dependent-transaction-in-separate-database-connections
- https://www.endpointdev.com/blog/2010/07/distributed-transactions-and-two-phase/
- https://www.citusdata.com/blog/2017/11/22/how-citus-executes-distributed-transactions/
- (来自 golang 客户端应用程序)https://github.com/go-pg/pg/issues/490
请我真的很困惑,我希望 horse_with_no_name 出现在这里并启发我(就像过去发生的那样)或任何其他可以帮助我的慈善灵魂。
提前致谢!
分辨率(在 Laurenz 的回答之后)
连接到 db1,这些是要执行的 sql 行:
同时连接到 db2 这些将是要执行的脚本:
这
-- Stop point --
是协调进程(例如执行语句的应用程序,或 psql 客户端控制台或 pgAdminII 后面的人)应停止执行两个脚本的地方(实际上不执行任何进一步的指令,这就是我所说的停止)。然后,首先在 db1 上(然后在 db2 上,反之亦然)必须
PREPARE TRANSACTION
在每个连接上运行协调进程(无论是否为人)。- 如果其中一个失败,那么协调器必须
ROLLBACK PREPARED
在已经准备好事务的那些数据库和其他数据库上 运行ROLLBACK
。 - 如果没有人失败,则协调器必须在所有相关数据库上运行 COMMIT PREPARED,这是一项永远不会失败的操作(例如,当您在房子外面一步,所有东西都正确设置为安全退出时,就已经存在了家)
- 如果其中一个失败,那么协调器必须
distributed-system - 两阶段提交是否安全
我发现许多读物说 2PC 是安全的,这意味着它要么提交事务,要么回滚。更具体地说,[如果有人提交,没有人会中止;如果一个人中止,没有人提交]。(http://www0.cs.ucl.ac.uk/staff/B.Karp/gz03/f2010/gz03-lecture6-2PC.pdf)
从Wikipedia,我知道在提交阶段,所有进程都会做以下事情:
- 协调者向所有参与者发送提交消息。
- 每个参与者完成操作并释放事务期间持有的所有锁和资源。
- 每个参与者向协调器发送一个确认。
- 协调器在收到所有确认后完成事务。
我想知道在第 1 阶段,协调器是否在向多个参与者发送消息后失败,这意味着一些参与者会收到提交消息,而其他参与者不会。然后那些收到的人将提交,而其他人仍将被阻止。所以我认为2PC在这里不能保证安全?
architecture - 事务管理器 2 阶段提交方法和 saga SEC 方法有什么区别?
我正在研究微服务架构。我知道有3种方法:
2阶段提交
佐贺
最终一致性
我对 2 阶段提交方法和 saga 方法有疑问。
在 2 阶段提交中,我们有事务管理器。在 saga 方法中,我们有 saga 日志和 saga SEC。两种方式我们都将责任交给了中央系统。那么具体有什么区别。
distributed-algorithm - 两阶段提交:如果协调者在发送两次确认之间死亡会发生什么
我试图了解两阶段提交协议的工作原理,但遇到了一个我不清楚的问题。
假设协调器发送了两个提交请求并且两个接收者都确认了。现在它开始发送提交请求,但在第一个和第二个请求之间协调器失败了。这意味着第一个收件人将提交,而第二个收件人不会。它不会让分布式系统处于不一致的状态吗?这样的事情怎么解决?
c++ - 使用简单的两阶段锁定的并发程序
问题:我想使用所谓的两相锁定概念同时计算一些方程。
我的方法:创建一个数组,将实时更新每个变量的值。我有点卡在我应该创建线程的方式上,在算法上应用互斥锁/信号量以并发执行。
输入(当然,我会建立一个更大的方程组来测试并发程序的效率)
输入说明:
第一行是未知数。(&0 和 &1 是未知数)第二行是它们各自的初始值。(&0 等于 3,&1 等于 6) 下一行是方程式。
输出
在我实现方程的结构下方(可以吗?可以改进吗?)
mongodb - mongodb社区服务器是否支持两阶段提交?
mongodb 社区服务器是否支持单阶段提交或两阶段提交。
asp.net - 管理分布式事务
我正在 Asp.Net Core 上开发一个系统,其中包含两个微服务:身份验证和主要 - 应用程序服务。
我有一个问题:在用户创建时,我应该使用 Saga 模式来管理分布式事务还是可以使用两阶段提交?在这种情况下会更好(需要在两个微服务上创建用户)。我会在用户创建时向客户端发送消息吗?
redis - Redis 在复制中使用哪种提交协议与副本通信?
我试图了解 Redis 如何处理复制。根据文档,Redis 有一个 master 和 n 个 slave,它们本身也可以有 n 个 slave。据我了解,这会导致树状结构。主设备异步更新确认更新的从设备。但是,我想知道使用什么协议。我理解它是 One-Phase-Commit,因为我没有读到 Redis 没有明确的准备阶段,因此没有使用两阶段。
我理解对了吗?谢谢你。
(如果您有任何有用的进一步资源,我很高兴了解更多信息。到目前为止,我没有找到任何关于所使用协议的明确文档)
database - 2PC(2阶段提交)和2 PL(2阶段锁定)之间的区别
两者有什么区别?表面上的协议看起来不同,但我想了解两者之间真正的不同之处以及它们为什么不等价。