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

时间:2016-11-27 08:22:39

标签: sql sqlite race-condition

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

要确保返回的值对应于数据库的当前状态,请利用SQLite的ACID保证(此处:atomicity):包装批量插入,last_insert_rowid()调用,以及任何您在单个交易中使用ID。

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