微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spring-spanner 的写会话保持活动是如何工作的?

如何解决spring-spanner 的写会话保持活动是如何工作的?

我不知道为什么 spring-spanner 对写会话的 keep-alive 可以在不中止的情况下工作。

我的理解如下:

  • 一个写会话在它被实际使用并保留在会话池中之前开始读写事务。
  • Keep-alive exec Jedi server 在 application.yaml 中指定的时间间隔(认为 30 分钟)。
  • 如果在执行最后一个 sql 后超过 10 秒,spanner 的读写事务会导致中止。

所以我认为它会在最后一次保持活动执行后 10 秒后导致中止。 但是,我还没有看到这种情况的中止。

它是如何工作的?

解决方法

我可以看出这有点令人困惑,但实际上有两种不同的事情可能会超时,并且可能需要在 Cloud Spanner 中进行保持活动查询。

  1. 如果读/写事务处于活动状态并且闲置超过 10 秒,它们将被中止。为了使其保持活动状态,您可以使用 SELECT 1 查询对其进行 ping 操作。但是:您通常应该这样做,因为您应该尽量保持您的读/写事务尽可能短。混淆来自这样一个事实,即读/写事务只有在执行了至少一个语句后才会被视为活动。所以会话池中准备好的事务只是以BeginTransaction开始的,但是他们还没有看到任何语句。因此,这些不会开始,也不会中止。
  2. 会话 将在 60 分钟后超时。会话池中每 30 分钟执行一次的 SELECT 1 保持活动查询用于防止会话超时。

现在的下一个问题可能是:在池中已经准备好读/写事务的会话上执行的 SELECT 1 语句会不会在 {{1} } ping 查询被执行,然后在 10 秒后被中止?

答案是否定的。 SELECT 1 ping 查询使用一次性只读事务执行。这不会影响同一个会话上准备好的读/写事务,因此会话和读/写事务都将保持有效。

不能在一个会话中同时执行多个事务的限制仅适用于同时处于活动状态的多个读/写事务。


编辑:添加了其他示例以显示允许和不允许的内容。

以下示例使用生成的 Java Spanner 客户端 (SELECT 1) 来展示在一个会话上执行多个事务时哪些是可能的,哪些是不可能的。下面的所有语句除了最后一条都会成功。

com.google.cloud.spanner.v1.SpannerClient

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。