0

我正在为我的服务器应用程序使用 Kotlin、KmongoKtor来管理 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 匹配名称无效。当这个函数执行时,第一次写操作经过第二次没有。

这不是我对交易的期望,尽管第一次写入正确匹配,但我希望两者都失败。

4

0 回答 0