我正在为我的服务器应用程序使用 Kotlin、Kmongo和Ktor来管理 MongoDB。
这是一个使用事务的函数:
var txnOptions: TransactionOptions = TransactionOptions.builder()
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.LOCAL)
.writeConcern(WriteConcern.MAJORITY)
.build()
runBlocking {
client.startSession().use { session ->
session.startTransaction(txnOptions)
try {
collection.updateOneById(
clientSession = session,
id = "validIdName", // matched with a valid field name so this will be successful
update = set("validFieldName", "999")
).wasAcknowledged()
collection.updateOneById(
clientSession = session,
id = "invalidIdName", // invalid id so this will not be executed
update = set("validFieldName", "999")
).wasAcknowledged()
session.commitTransactionAndAwait()
} catch (e: MongoCommandException) {
functionSuccessful = false
session.abortTransaction()
throw error(e.localizedMessage ?: e)
} finally {
session.close()
}
}
}
所以我希望两个写入操作都会失败,因为第二个操作的 id 匹配名称无效。当这个函数执行时,第一次写操作经过第二次没有。
这不是我对交易的期望,尽管第一次写入正确匹配,但我希望两者都失败。