【问题标题】:How to resolve ReadWithUncertainityInterval in cockroach database with springboot如何使用spring boot解决蟑螂数据库中的ReadWithUncertainity Interval
【发布时间】:2022-01-28 08:05:36
【问题描述】:

在使用 springboot 在 cockroach 数据库中执行写入/读取操作时,我们会间歇性地出现以下错误。这里的任何解决方案都值得赞赏。谢谢

原因:

org.postgresql.util.PSQLException: ERROR: restart transaction: TransactionRetryWithProtoRefreshError: ReadWithinUncertaintyIntervalError: read at time 1640760553.619962171,0 遇到以前的写入,带有未来的时间戳

【问题讨论】:

  • 您必须提供导致错误消息的代码段

标签: postgresql spring-boot spring-data-jpa cockroachdb


【解决方案1】:

documentation 指出此错误是争用迹象。它还提出了四种解决方法:

  • 准备好重试不确定性(和其他)错误,如客户端重试处理中所述。
  • 将历史读取与 SELECT ... AS OF SYSTEM TIME 结合使用。
  • 设计架构和查询以减少争用。有关如何发生争用以及如何避免争用的更多信息,请参阅了解和避免事务争用。特别是,如果您能够在一个批次中发送事务中的所有语句,CockroachDB 通常可以自动为您重试整个事务。
  • 如果您相信自己的时钟,您可以尝试将 --max-offset 选项降低到 cockroach start,该选项提供了由于不确定性而可以继续重新启动事务的上限。

你已经尝试过这些了吗?

【讨论】:

  • 是的,我确实阅读了文档……但我不太了解 cockroachdb 中处理的时间戳缓存。这是否意味着当事务从范围中读取特定记录,并且 t2 来尝试读取相同的记录时,t2 被搁置,直到 t1 完成其关联事务?我知道这适用于写入,但即使对于并发读取也适用?
  • @Dheeraj 您的问题和您发布的错误消息提到了 write 操作。如果所有事务都只读取数据,您将不会收到此错误消息,因为“previous write with future timestamp”不可能发生。也许您的某些交易在您不知情的情况下写入数据?
  • 对不起,我稍微偏离了问题的上下文。但要回答你,是的,我们在同一个事务中进行了写操作。根据 cockroach db 文档,当它在向客户端抛出异常之前注意到陈旧数据时,它会在内部尝试重试事务。所以想了解第二个事务在队列中等待第一个事务释放锁的时间。
  • 您确定服务器重试事务吗?您可以发布指向文档的链接吗?我假设始终是客户端负责重试,尽管这可能隐藏在某些库代码中,因此对应用程序代码是透明的。
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2022-07-08
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多