indexeddb 所有操作必须在事务中进行,事务通过 db.transaction() 创建并指定对象仓库和模式(readonly/readwrite/readwriteflush);增删改查需获取对象仓库后调用 add/put/delete/get/getall 等方法,返回 idbrequest 并监听 onsuccess/onerror;事务自动提交或出错时回滚,可监听 oncomplete/onerror/onabort;批量操作应复用同一事务,游标遍历需手动 continue。

IndexedDB 使用事务(transaction)来保证数据操作的原子性和一致性,所有增删改查都必须在事务中进行,不能直接操作数据库。
事务的创建和类型
事务通过 db.transaction() 创建,需指定目标对象仓库(object store)名称和事务模式:
- "readonly":只读事务,适合查询操作,性能高、并发强
- "readwrite":读写事务,支持增、删、改,同一时间仅一个可写事务活跃
- "readwriteflush"(较少用):强制立即写入磁盘,适用于关键数据场景
例如:const tx = db.transaction("users", "readwrite");
在事务中执行 CRUD 操作
获取对象仓库后,调用对应方法发起请求,所有操作返回 IDBRequest 对象,通过 onsuccess 和 onerror 处理结果:
- 添加(add):使用 store.add({id: 1, name: "Alice"}),主键冲突会报错
- 新增或替换(put):用 store.put({id: 1, name: "Alice"}),主键存在则更新,不存在则插入
- 删除(delete):传入主键值,如 store.delete(1)
- 查询(get / getAll):用 store.get(1) 获取单条,store.getAll() 获取全部(注意大数据量慎用)
事务生命周期与错误处理
事务自动提交——当所有请求完成且无未处理错误时结束;一旦有请求失败或显式调用 abort(),事务回滚:
- 监听 tx.oncomplete 做成功后逻辑(如刷新 UI)
- 监听 tx.onerror 统一捕获错误(注意:它不阻止默认错误冒泡,常需 event.preventDefault())
- 监听 tx.onabort 处理被取消场景(如用户关闭页面、手动 abort)
- 避免在事务外保留游标或请求结果,它们随事务结束失效
批量操作与游标遍历
对多条记录操作,推荐用单事务包裹多个请求,而非多个小事务:
- 批量写入:循环调用 store.put(item),共享同一个事务
- 范围查询:用 store.openCursor(IDBKeyRange.bound("A", "M")) 遍历匹配记录
- 游标中可调用 cursor.update() 或 cursor.delete() 修改/删除当前项
- 注意游标需主动调用 cursor.continue() 才能继续,否则只处理第一条
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











