2016-11-27 29 views
0

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

回答

1

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

为确保返回的值与数据库的当前状态相对应,请利用SQLite的ACID保证(此处为原子性):将批处理插入,last_insert_rowid()调用以及您使用ID进行的任何操作一笔交易。

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

+1

@Zso的评论呢?他建议多线程可以使用相同连接的场景。交易会防范吗? – maxedison

+0

一个连接=一个事务,因此无论线程模式如何,都不应从多个线程访问相同的连接。 –

+0

这个答案不应该被接受,因为它谈论**进程**,但风险在于使用**线程**。 'last_insert_rowid()'不一定是多线程安全的; “多线程”线程模式会禁用数据库连接的禁用。 – Zso

1

last_insert_rowid()是依赖于连接的,所以当多线程使用相同的连接时,如果没有将SQLite切换到序列化线程模式,就有风险。

+1

串行线程模式如何防范此问题?它是否阻止多个线程使用相同的连接? – maxedison

+0

没有什么能阻止你使用多线程,但默认情况下SQLite处于序列化模式。它应该使SQLite线程安全,即使在相同的数据库连接通过互斥体。 – Zso

+0

您的原始问题表明**进程**,但您似乎对**线程**感兴趣。 (数据库连接不能在进程之间共享。) – Zso