我面临着检索最后添加的行 ID 的常见问题。问题是,我希望这个操作尽可能原子,以完全线程安全。我用ADO.NET wrapper围绕 SQLite。
这是我的研究:
SQLiteConnection
类提供LastInsertRowId
属性,该属性返回上次成功插入操作的RowId
。但是,如果某个线程 had enough luck在评估LastInsertRowId
期间将一些数据推送到表中,我会得到一些错误的 ID(很可能不是我正在搜索的 ID)。- SQLite 维护一个名为
sqlite_sequence
的表,其中存储用于生成AUTOINCRMENT
键的值。我可以手动增加其中一个值,然后插入具有预定义 Id 值的行(我使用存储过程在 MySQL 中执行类似操作)。问题是,如果我希望这个解决方案是安全的,我必须实现从此表中进行选择、增量和更新作为原子过程,但我不知道该怎么做。 - 适用于 SQLite 的 Android API 包含
insert
方法,它返回最后添加的行的 ID,但我在我使用的包装器中找不到这样的方法。
所以问题是:如何以线程安全的方式检索最后添加的行的 ID?
最佳答案
我们处理这个问题的方法是启动一个事务,执行插入或更新,执行 SELECT last_insert_rowid ()(检索其结果),然后提交事务。
由于事务性质以及此操作返回当前连接的信息,而不是与数据库的任何其他连接的信息,这应该是原子的。
关于c# - SQLite - 检索最后一行的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17634795/