Swift中Realm写入报‘已处于写入事务’错误的原因与解决办法
Realm写入错误:"The Realm is already in a write transaction" 触发场景与解决对策
触发场景
- 当前Realm实例已处于未完成的写入事务中:比如外部已经调用了
beginWrite()但还没执行commitWrite()或rollback(),此时再调用自动开启事务的realm.write {}就会冲突。 - 嵌套写入事务:你提供的代码中,
action?(model)闭包内部如果又调用了realm.write {}或者手动开启了写入事务,就会触发错误——Realm不支持嵌套写入事务。 - 多线程上下文冲突:如果当前Realm实例是跨线程创建的,或者同一线程存在多个未清理的事务上下文,也可能引发该错误,但结合你的代码片段,前两种场景概率更高。
解决对策
1. 先检查事务状态再执行操作
在调用写入操作前,先判断Realm是否已处于事务中,避免重复开启:
if let model = searchWithPrimaryKey(modelType: T.self, primaryKey: primaryKey) as? T { if !realm.isInWriteTransaction { try realm.write { action?(model) } } else { // 直接在已有事务中执行修改 action?(model) } }
2. 清理闭包内的嵌套事务
检查action?(model)闭包中的代码,确保没有再次调用realm.write {}或者手动开启事务。如果闭包需要修改Realm对象,直接在当前事务上下文里操作即可,不需要额外开启事务。
3. 手动管理事务(精细控制方案)
如果需要更灵活的事务管理,可以手动控制事务的开启、提交和回滚:
if let model = searchWithPrimaryKey(modelType: T.self, primaryKey: primaryKey) as? T { do { if !realm.isInWriteTransaction { try realm.beginWrite() } action?(model) if realm.isInWriteTransaction { try realm.commitWrite() } } catch { if realm.isInWriteTransaction { realm.rollback() } // 这里处理错误逻辑 } }
内容的提问来源于stack exchange,提问作者white
相关产品推荐
相关产品推荐

