IndexedDB 的 put() 方法天然支持幂等写入:已存在 key 时覆盖,不存在时插入。需正确配置 keyPath、使用 readwrite 事务,并区分显式 key 与内嵌 key 模式,避免 DataError。

IndexedDB 的 put() 方法天然支持幂等写入:当传入的 key 已存在时自动覆盖,不存在时插入新记录,无需手动判断。关键在于正确配置 object store 的 key path 和使用事务机制。
确保 object store 支持自动键生成或显式指定 key
幂等写入的前提是每次操作都能明确对应到唯一记录。有两种常用方式:
-
显式 key 模式:object store 不设
keyPath,调用put(value, key)时传入明确的 key(如字符串 ID 或数字); -
内嵌 key 模式:object store 设置了
keyPath(如id),value 对象必须包含该属性,put(value)自动提取 key,不传第二个参数。
错误示例:设置了 keyPath: 'id' 却又调用 put(obj, 'abc'),会抛出 DataError 异常。
在 readwrite 事务中安全调用 put
put() 只能在 readwrite 或 versionchange 事务中执行。务必监听 onsuccess 和 onerror,避免静默失败:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const transaction = db.transaction('users', 'readwrite');
const store = transaction.objectStore('users');
const request = store.put({ id: 'user_123', name: 'Alice', email: 'a@example.com' });
request.onsuccess = () => {
console.log('写入/更新成功,主键:', request.result); // 返回写入后的 key
};
request.onerror = () => {
console.error('写入失败:', request.error);
};
处理并发更新与版本升级场景
多个 tab 同时写同一 key 时,IndexedDB 按事务提交顺序串行执行,天然避免竞态。但需注意:
- 若需读-改-写逻辑(如计数器自增),不能依赖先
get再put,应使用put直接覆盖最新值,或借助cursor.update()(仅限游标遍历时); - 数据库升级时(
onupgradeneeded),可安全重建 store 并重新put初始数据,不影响已有记录的幂等性。
验证幂等性的小技巧
快速确认是否生效:连续两次调用相同 put,检查控制台无报错且第二次 request.result 返回的 key 与第一次一致,即说明已更新而非重复插入。
不复杂但容易忽略。

















