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
相关产品推荐
相关产品推荐

