You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB Realm写入异常:[Closing with open read transactions]问题求助

异常解决:RLM_ERR_WRONG_TRANSACTION_STATE: Closing with open read transactions

核心原因

这个异常是因为Realm实例存在未正确关闭的读事务时,尝试执行写操作或关闭实例,导致事务状态冲突。结合你的代码,大概率是getRealmUser()函数存在读事务泄漏,或是单例Realm实例的生命周期管理不当。

具体解决步骤

1. 修复Realm实例的生命周期管理

你的单例Realm实例长期持有,容易累积未关闭的事务。改用use块自动管理Realm的打开和关闭,确保每次操作后正确释放资源:

// 修改upsertRealmFromDB中的写操作部分
Realm.open(realmConfiguration).use { realm ->
    realm.writeBlocking {
        val result = this.query<User>("UserID == $0", tempID).find()
        val user = if(result.isEmpty()) null else result.last()
        // 后续的更新/插入逻辑保持不变
    }
}

use块会在代码执行完毕后自动关闭Realm实例,彻底避免事务泄漏问题。

2. 检查并修复getRealmUser()函数

这个函数是关键隐患点,必须确保所有Realm读操作都在事务块内执行:

  • 如果getRealmUser()是查询Realm获取用户,必须用read或readBlocking包裹:
fun getRealmUser(): User? {
    return Realm.open(realmConfiguration).use { realm ->
        realm.readBlocking {
            // 你的查询逻辑,比如:
            query<User>().firstOrNull()
        }
    }
}
  • 绝对不能在事务块之外直接持有Realm对象的引用(比如直接返回realm.query().find().first()),否则会绑定未关闭的读事务。

3. 简化冗余代码

你代码中提前创建的tempUser对象没有实际用途,可以直接删除,减少不必要的对象创建,避免潜在的引用问题。

验证方案

按上述修改后重新测试:

  • 确保所有Realm操作(读/写)都在对应的read/readBlocking或write/writeBlocking块内执行
  • 所有Realm实例都通过use块自动管理生命周期

内容的提问来源于stack exchange,提问作者Derwin Oesmanto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:16:30