gpt4 book ai didi

java - 如何在 Web 服务中处理并发数据修改困惑和合并(乐观/悲观锁定)?

转载 作者:行者123 更新时间:2023-11-29 13:02:23 29 4
gpt4 key购买 nike

<分区>

我有一个 Web 服务和几个后台运行的异步服务(用于长时间运行的数据收集过程),它们使用相同的 DAO 库和共享数据源。使用 Spring JDBC 模板实现的 DAO 库。 RDBMS 是 PostgreSQL。
当 Web 服务和异步服务通过 DAO 同时修改一个表中的相同行并因此导致数据不一致时,这种情况并不少见。
例如,我在一个实体中有一个“状态”字段,它可以取值:1 - 付费,2 - 未付费。

有时我会遇到这样的情况:

  • 事务 #1:Web 服务正在修改来自1 到 2 到 ID = 1 的行。
  • 事务 #2:同时一个异步服务正在抓取一些来自某些端点的数据并修改具有 ID 的行的另一个字段= 1。但“state”字段仍为 1。它不知道“state”值在事务 #1 中从 1 更改为 2。

结果我的“状态”等于 1,尽管它必须是 2。它也有争议。有时异步服务会更改“状态”字段,而 Web 服务不知道此更改并再次造成数据困惑。当然,它不仅发生在状态字段上。

我有两个选择:

  1. 使用悲观的 SELECT ... FOR UPDATE。
    但它不适合我因为网络服务经常从表中获取部分行。它异步服务保持时不能等待很长时间锁定,因为这里的性能至关重要。
  2. 使用乐观锁定。 “版本”字段等等。
    但我不能只回滚在乐观锁定失败的情况下发生变化,因为这会改变必须合并。有时我不能只是重复操作,因为另一个系统中的原子操作不是 spring jdbc 事务的一部分。

可能存在一些模式来处理合并数据这样的情况?

谢谢,
伊万

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com