【问题标题】:JDBC Source Connector Error: Transaction was aborted. It was wounded by a higher priority transaction due to conflict on keys in rangeJDBC 源连接器错误:事务已中止。由于范围内的键冲突,它被更高优先级的事务伤害了
【发布时间】:2021-09-25 12:16:01
【问题描述】:

我正在使用带有 JDBC 驱动程序的 JDBC 源连接器来收集从 Google Cloud Spanner 到 Kafka 的数据。 我在桌子上使用“时间戳+递增”模式。表的主键包括 2 列(order_item_id 和 order_id)。 我使用 order_item_id 作为递增列,使用名为“updated_time”的列作为时间戳列。

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

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'
...

我想知道在我的情况下这个错误是如何发生的。顺便说一句,即使出现错误,连接器仍然可以在最后收集数据。任何人都可以帮忙吗?非常感谢!

【问题讨论】:

    标签: jdbc apache-kafka-connect google-cloud-spanner


    【解决方案1】:

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

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

    例子:

    jdbc:cloudspanner:/projects/my-project/instances/my-instance/databases/my-database;readonly=true;autocommit=true

    也可能是您正在使用的框架在打开 JDBC 连接后对其进行了更改。在这种情况下,您应该看看是否可以在框架中更改它。但是在这种情况下,根据上面的示例更改 JDBC URL 可能就足够了。

    背景信息:

    如果在关闭自动提交的情况下打开 JDBC 连接并且连接处于读/写模式,则在执行查询时将自动启动读/写事务。所有后续查询也将使用相同的读/写事务,直到在连接上调用 commit()。这是在 Cloud Spanner 上读取大量数据的效率最低的方法,因此应尽可能避免。它还会导致事务中止,因为读取操作会锁定它正在读取的数据。

    【讨论】:

    • 您好 Knut,非常感谢您的详细解释、解决方案和上下文。对理解 JDBC 连接器设置中 Spanner 读/写的内容有很大帮助!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多