当前位置: 首页 > 知识库问答 >
问题:

JDBC源连接器错误:事务中止。由于范围内键的冲突,它被一个更高优先级的事务伤害

楚良平
2023-03-14

当我启动连接器时,有时会出现以下错误,但最终还是可以获得数据。

ERROR Failed to run query for table TimestampIncrementingTableQuerier{table="order_item", query='null', 
topicPrefix='test_', incrementingColumn='order_item_id', timestampColumns=[updated_time]}: {} 
(io.confluent.connect.jdbc.source.JdbcSourceTask:404)
com.google.cloud.spanner.jdbc.JdbcSqlExceptionFactory$JdbcAbortedDueToConcurrentModificationException: 
The transaction was aborted and could not be retried due to a concurrent modification
...
Caused by: com.google.cloud.spanner.AbortedDueToConcurrentModificationException: 
The transaction was aborted and could not be retried due to a concurrent modification
...
Suppressed: com.google.cloud.spanner.connection.AbstractBaseUnitOfWork$SpannerAsyncExecutionException: 
Execution failed for statement: 
SELECT * FROM `order_item` WHERE `order_item`.`updated_time` < @p1 AND ((`order_item`.`updated_time` = @p2 AND `order_item`.`order_item_id` > @p3) OR `order_item`.`updated_time` > @p4) ORDER BY `order_item`.`updated_time`,`order_item`.`order_item_id` ASC
...
Caused by: com.google.cloud.spanner.AbortedException: ABORTED: io.grpc.StatusRuntimeException: 
ABORTED: Transaction was aborted. It was wounded by a higher priority transaction due to conflict on keys in range [[5587892845991837697,5587892845991837702], [5587892845991837697,5587892845991837702]), column adjust in table order_item.
retry_delay {
  nanos: 12974238
}
 - Statement: 'SELECT * FROM `order_item` WHERE `order_item`.`updated_time` < @p1 AND ((`order_item`.`updated_time` = @p2 AND `order_item`.`order_item_id` > @p3) OR `order_item`.`updated_time` > @p4) ORDER BY `order_item`.`updated_time`,`order_item`.`order_item_id` ASC'
...

我想知道这个错误是怎么发生在我的情况下的。顺便说一句,即使有错误,连接器仍然可以在最后收集数据。有人能帮忙吗?太感谢你们了!

共有1个答案

谢嘉
2023-03-14

我不确定整个管道是如何设置的,但错误表明您正在读/写事务中执行查询。Cloud Spanner上的任何读/写事务都可能被Cloud Spanner中止,并可能导致您所看到的错误。

如果您的管道只从Cloud Spanner读取数据,最好的做法是将JDBC连接设置为只读和自动提交模式。通过将readonly=trueautocommit=true属性添加到URL中,可以直接在JDBC连接URL中执行此操作。

示例:

 类似资料:
  • 我在集群中有一个Hazelcast客户端和两个Hazelcast服务器,每个服务器包含单个复制的Map。 我给客户端2个hazelcast服务器节点,以便从replicatedMap中读取。 我是否可以将连接优先级赋予一台服务器,并在连接处于活动状态时从该服务器读取数据? 为了澄清,假设有MasterServer、SlaveServer和Client。 如果复制地图操作之间存在连接,我们是否可以强

  • 我在一个游戏服务器上使用Hibernate for ORM,刚刚从每个工作单元的会话/事务切换到每个请求的会话/事务。 由于多个事务可能相互冲突,因此我使用悲观锁定。问题是我经常遇到僵局。现在我的问题是,是否可以在锁定特定实体实例的事务中显式定义范围,或者在指定锁定模式后是否锁定实例直到我提交事务? 如果后者成立,如果我不能任意调度锁定数据库中资源的方法的方法调用,我如何避免每个请求环境中的会话事

  • 问题内容: 最近,在一个用于mysql数据库的PHP脚本中,我需要在恰好位于另一个事务内部的某个位置使用事务。我所有的测试似乎都表明这很好,但是我找不到有关此用法的任何文档。 我想确定-交易中的交易在mysql中是否有效?如果是这样,是否有办法找出嵌套事务中的层数?(即恢复到正常状态需要多少回滚) 预先感谢,Brian 问题答案: 手册的本页可能使您感兴趣: 12.3.3。 导致隐性提交的陈述 ;

  • 我正在使用sidekiq 3.4.2和redis 3.0.3处理一些长时间运行的作业,大约两到四个小时后,我得到以下错误: 错误:心跳:由于以前的错误,已放弃ExecutAbort事务。 EXECABORT事务由于以前的错误而被丢弃。 /home/deployer/apps/wripl-capture/shared/bundle/ruby/2.2.0/gems/redis-3.2.1/lib/re

  • 主要内容:提交和回滚,使用保存点如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。 对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交并管理自己的事务 - 提高性能 保持业务流程的完整性 使用分布式事务 事务能够控制何时更改提交并应用于数据库。 它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败。 要启用手动事务支持,而不是使用JDBC驱