在 SQLite 中检索批量插入行的 ID

Retrieving ids of batch inserted rows in SQLite

我正在使用 SQLite 的 last_insert_rowid() 获取批量插入后最后插入的行 ID。是否存在可能导致此值不是 return 批插入的最后一个 ID 的竞争条件风险?例如,在插入完成和调用 last_insert_rowid() 之间是否有可能某个其他进程可能再次写入 table?

last_insert_rowid() 依赖于连接,因此当多个线程使用同一个连接时存在风险,而 SQLite 没有切换到序列化线程模式。

last_insert_rowid() returns 有关在此特定连接中完成的最后一次插入的信息;它不能 return 其他进程写入的值。

为了确保 returned 值对应于数据库的当前状态,利用 SQLite 的 ACID 保证(这里:原子性):包装批量插入,last_insert_rowid() 调用,以及您在单个事务中使用 ID 执行的任何操作。

在任何情况下,last_insert_rowid() 的 return 值仅在通过此连接完成某些插入时才会更改,因此您永远不应该从多个线程访问同一个连接,或者如果您真的想要为此,请手动序列化整个交易。