我想在PostgreSQL数据库上使用Debezium进行变更数据捕获(CDC)。现在我还不完全理解如何处理Debezium的交易。
让我们考虑下面的例子--我在源PostgreSQL数据库中有2个表。我在单个数据库事务的范围内将数据插入到这两个表中。换句话说,我必须执行两个单独的insert
语句。如果我理解正确,在Debezium CDC的情况下,它将导致两个单独的消息,两个单独的Kafka主题(或AWS Kinesis流)。这些消息中的每一条都将由自己的使用者消费,并在单独的事务中插入到目标数据库中。如果其中一个事务失败,另一个可以成功,我将在目标数据库中运行到数据不一致状态。
Debezium有没有标准的机制来处理这种情况?或者例如,为了避免它,我必须使用Kafka Streams API,并在更新目标DB之前将这两个主题合并为一个主题(在transactionId上)?
您正确地描述了默认行为。
如果希望使用一个事务将多条记录写入接收器数据库,则可能必须使用定制的使用者应用程序,该应用程序在内部缓冲源自一个事务的事件,并在单个事务中一次性将其写入接收器数据库。简单地将事件集中在一个主题上对您没有帮助,因为一般的接收器连接器仍然不知道源事务边界。
您可以使用Debezium的事务元数据主题。它提供了用户应用程序实现缓冲逻辑所需的所有信息。不幸的是,我们还没有一个全面的演示,但我希望我们将得到有关这一点的博客很快。
TRANSACTION(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 当事务
问题内容: 我正在研究应用数据库架构更新的脚本。我已经使用start transaction / commit设置了所有的SQL更新脚本。我在命令行上将这些脚本传递给psql。 现在,我需要在一个事务中同时应用多个脚本。到目前为止,我想出的唯一解决方案是从原始脚本集中删除启动事务/提交,然后将它们卡在新的启动事务/提交块中。我正在编写perl脚本来即时执行此操作。 实际上,我想要嵌套事务,但是我无
我是Flask和SQLAlchemy的新手(在过去3年中一直与Django合作)。我需要调用一个现有的PostgreSQL函数,该函数可以写入数据库中的3个不同表。这是我无法控制的(我必须让它工作)。该函数返回一条记录(自定义Postgres类型),其中包含有关结果的信息。代码如下: 上面的代码运行时没有错误。从日志消息中,我可以看到正确的数据是从数据库返回的。但是,如果我转到psql,就看不到新
我正在使用DAO进行事务管理。场景是创建包含quote_line和客户列表的新报价。如果客户不存在,它将把它插入表客户中。我的代码是如下架构: 在调试模式下,我只有两个变量:1-这(QuoteService)2-quote 这是th日志: 您可以注意到,消息“第44行删除”已打印,但没有从hibernate查询中删除的痕迹。 这段代码不起作用:使用customerDao和quoteLineDao的
我想在我的应用程序开始时读取文本数据夹具(CSV文件),并将其放入数据库。 为此,我创建了一个带有初始化方法的PopulationService(@PostConstruct注释)。 我还希望它们在单个事务中执行,因此我在同一个方法上添加了@Transactional。 然而,@Transactional似乎被忽略了:事务在我的低级DAO方法中启动/停止。 那么我需要手动管理交易吗?
我有一个表和几个线程(系统),它们从表中读取特定列并更新它。因此,我的问题如下: 我想确保在任何时候只有一个线程可以选择和更新该列。最好的解决方案是什么? PS:据我所知,在SQL Server中使用事务会锁定事务中的所有资源,但我对PostgreSQL一无所知。 非常感谢。