java - MongoDB 多文档事务中同一文档多次更新的问题

标签 java mongodb transactions

我在使用多文档交易时遇到很多麻烦。其中之一恰好是 - 每当同一文档[在同一事务中]有多个更新时,Mongo 会抛出一个奇怪的错误“com.mongodb.MongoCommandException:命令失败,错误 251 (NoSuchTransaction):'事务 1 已中止。'在服务器上......”。我把它放在可见性的方向上,并调整了读写问题的选项,例如

WriteConcern.MAJORITY、ReadPreference.PRIMARY、ReadConcern.SNAPSHOT。

我正在使用 java 驱动程序,事务启动的代码片段如下所示

TransactionOptions transactionOptions = TransactionOptions.builder()
.writeConcern(WriteConcern.MAJORITY)
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.SNAPSHOT)
.build();

ClientSessionOptions clientSessionOptions = ClientSessionOptions
.builder()
.defaultTransactionOptions(transactionOptions)
.build();

this.session = mongo.startSession(clientSessionOptions);
this.session.startTransaction(transactionOptions);

有人对这个错误有任何想法吗?

最佳答案

为了获得有关错误的更多上下文,您需要检查 Mongodb 日志。

在 Mongo shell mongo 中,运行 show log global,您将看到事务失败的原因。

就我而言,它因以下原因失败:

[startPeriodicThreadToAbortExpiredTransactions] Aborting transaction with 
txnNumber 1 on session ea5e8c8d-ecc2-47ca-8901-55a43143a809 because it has 
been running for longer than 'transactionLifetimeLimitSeconds'

这看起来像是 MongoDB 中的一个错误,因为它应该抛出 transactionLifetimeLimitSeconds 错误,或者至少告诉您问题是什么。

关于java - MongoDB 多文档事务中同一文档多次更新的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54764326/

相关文章:

json - 如何使用 MongoDB C++ 驱动程序将字符串转换为 BSON?

MongoDB 根据现有字段计算分数并将其放入同一集合中的新字段中

java - 通过 SSL 连接 postgresql 时使用 "Verify-full"的开销

java - 用于在 Java 中比较对象的哈希

java - 动态 Web 项目何时使用 java?

java - 使用 GSON 将 JSON 字符串转为 Java 对象

集合中所有(特定)数组的元素的 mongodb 聚合总和

c# - 两个远程 sql 连接时 Transactionscope 不工作

mysql - Sequelize 事务执行回滚但数据库不执行

sql-server - 将 bcp 放入带有另一个 sql 语句的事务中