You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite获取LAST_INSERT_ROWID是否需要与插入操作包裹在同一事务中

问题结论

1. 无需将插入、取ID操作包裹在同一事务中

SQLite的LAST_INSERT_ROWID()是连接级别的上下文变量,每个数据库连接会独立维护自己最后一次插入操作生成的行ID,完全不受其他连接的操作影响。不管是否开启WAL模式,这个特性都是SQLite的原生保证:哪怕有其他连接同时向同一张表插入数据,也不会篡改当前连接存储的最后插入ID值。哪怕你用默认的自动提交模式,插入完成后立即调用LAST_INSERT_ROWID()也能拿到正确值,和事务是否提交无关。

你需要额外加事务的场景只有两种:

  • 你需要保证插入操作的原子性(比如同时插关联的多张表,要么都成功要么都回滚)
  • 批量插入时提升性能(避免单条插入自动提交的磁盘IO开销)
    但事务不是为了保证LAST_INSERT_ROWID()的返回正确性才必须加的。

2. 你给出的实现是非常成熟的通用方案,但需要满足两个前提:

  • 插入操作和LAST_INSERT_ROWID()调用必须在同一个数据库连接上执行,不能出现插入用连接A、取ID用连接B的情况
  • 两个操作之间,当前连接不能执行其他的INSERT写入操作,否则会覆盖连接存储的最后插入ID,导致返回值错误

额外注意事项

如果你的业务需要批量插入多条数据,且需要获取每一条生成的ID,需要插一条调用一次LAST_INSERT_ROWID(),不能等全部插入完成后再统一获取,此时只能拿到最后一条插入数据的ID。


内容的提问来源于stack exchange,提问作者LCsa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:48:01