indexeddb 事务不支持传统回滚,abort() 是唯一撤回未提交变更的方式,它中止整个事务、撤销所有待写入操作,仅对 active 状态事务有效,常用于校验失败或错误时防止脏数据写入。

IndexedDB 的事务不支持传统意义上的“回滚”操作,abort() 方法的作用是立即中止当前事务,并撤销该事务中所有尚未提交的更改——这本质上就是它的回滚机制。
abort() 是事务级中止,不是语句级回滚
IndexedDB 没有类似 SQL 的 ROLLBACK TO SAVEPOINT,也不允许部分回滚。调用 transaction.abort() 会丢弃整个事务内所有待写入的操作(add、put、delete),且不可逆。它只对“未完成”的事务有效,一旦事务已触发 complete 事件,再调用 abort 就无效了。
正确使用 abort() 的典型场景
常见于数据校验失败、用户主动取消、或发生预期外错误时,防止脏数据写入:
- 在
transaction.onerror或request.onerror中调用event.target.transaction.abort() - 在业务逻辑判断不满足条件时,直接调用
transaction.abort() - 注意:不能在
transaction.oncomplete回调里调用 abort(此时事务已完成)
实际代码示例
比如向 objectStore 写入前检查余额是否充足:
const transaction = db.transaction(['accounts'], 'readwrite');
const store = transaction.objectStore('accounts');
const request = store.get('user123');
<p>request.onsuccess = function() {
const account = request.result;
if (account.balance </p><p>// 继续写入操作
store.put({ ...account, balance: account.balance - 100 }, 'user123');
};</p><p>request.onerror = function() {
transaction.abort();
};</p>
abort 后的状态与注意事项
调用 abort() 后:
- 事务状态变为
"inactive",后续任何数据库操作都会抛出异常 - 会触发
transaction.onabort事件(可用于清理或通知) - 不会触发
oncomplete,但会触发onerror(如果 abort 是由错误引发) - 已成功写入的数据(如之前其他已 commit 的事务)不受影响
不复杂但容易忽略:abort 是唯一能“撤回”未提交变更的方式,关键在于及时调用且确保事务仍处于 active 状态。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











