Angular中调用IDBObjectStore.getAll报错:事务未激活
解决IndexedDB事务未激活错误
问题根源
你通过ctxMessage这个getter每次调用都新建事务,但IndexedDB的事务会在没有挂起的异步请求时自动提交关闭。当你在getAllMessage里解构出messageStore后,await会暂停代码执行,此时事务因为没有待处理的请求,已经被浏览器关闭,后续调用getAll()自然会抛出事务未激活的错误。
修复代码
把事务创建和数据操作放在同一个异步方法内,保证事务在整个操作周期内处于活跃状态:
private async getAllMessage(message: Message) { // 直接在方法内创建事务,确保事务与当前操作绑定 const messageTransaction = this.db.transaction('messages', 'readwrite'); const messageStore = messageTransaction.objectStore('messages'); const result = await messageStore.getAll(); // 可选:等待事务完成,确保数据操作彻底结束 await new Promise((resolve) => { messageTransaction.addEventListener('complete', resolve); messageTransaction.addEventListener('error', resolve); }); return result; }
额外注意点
- 移除
ctxMessage这类返回事务的getter,事务的生命周期必须和具体数据操作强绑定,分开创建必然导致提前关闭。 - 如果只是读取数据,将事务模式改为
readonly,性能会比readwrite更优。 - 多步数据库操作必须复用同一个事务实例,避免重复创建事务引发的状态问题。
内容的提问来源于stack exchange,提问作者Mukti Prasad Behera
相关产品推荐
相关产品推荐

