17370845950

JavaScript浏览器存储_IndexedDB事务管理
IndexedDB事务管理确保数据一致性,需通过事务操作对象仓库,其生命周期始于创建、终于请求完成,支持readonly和readwrite模式,错误将导致回滚,批量操作应共用事务以提升性能。

IndexedDB 的事务管理是操作数据库的核心机制。它保证了数据的一致性和完整性,特别是在执行添加、修改或删除等写操作时尤为重要。理解事务的生命周期和作用范围,能有效避免常见错误,比如在事务结束前访问对象仓库。

事务的基本概念

在 IndexedDB 中,所有对数据的操作都必须通过事务进行。事务围绕一个或多个对象仓库(Object Store)创建,并具有明确的作用域和模式:

  • 作用域(Scope):事务可以作用于一个或多个对象仓库,声明时需明确列出。
  • 模式(Mode)
    • readonly:仅支持读取操作。
    • readwrite:支持读取和写入操作。

例如,要向用户表添加一条记录,需要创建一个包含该对象仓库的 readwrite 事务。

事务的生命周期

事务的生命周期从创建开始,到自动结束或显式完成为止。关键点如下:

  • 事务在所有请求排队完成后会自动关闭,无需手动调用“提交”方法。
  • 一旦事务中所有异步操作完成且没有新的请求,事务进入完成状态。
  • 监听 oncomplete 事件可确认事务成功,onerrorabort 则表示失败。

常见错误是在事务已关闭后尝试使用之前获取的对象仓库引用,这将导致错误。正确做法是在事务生命周期内完成所有操作。

事务中的错误处理

事务对错误非常敏感,任何一个操作失败都可能导致整个事务回滚:

  • 为事务设置 onerror 回调,统一捕获异常。
  • 使用 event.preventDefault() 防止某些错误自动触发中止(需谨慎使用)。
  • 监听 onabort 事件判断事务是否被取消,并做相应处理。

例如,当主键冲突导致添加失败时,事务会中止,此时应提示用户或尝试更新而非插入。

批量操作与性能优化

在同一个事务中执行多个操作能显著提升性能,因为减少了事务开销:

  • 将多个 add()put() 请求放入同一事务,共享资源。
  • 注意不要在循环中创建新事务,否则性能急剧下降。
  • 长时间运行的事务可能被浏览器终止,应尽量缩短其持续时间。

比如导入一批用户数据时,使用单个 readwrite 事务依次发送请求,而不是每个用户单独开启事务。

基本上就这些。掌握事务的创建、作用域控制、生命周期管理和错误响应,是高效使用 IndexedDB 的基础。不复杂但容易忽略细节。