我面临检索最后添加的行 ID 的常见问题。问题是,我希望这个操作尽可能原子化以完全线程安全。我使用SQLite 周围的ADO.NET 包装器。
这是我的研究:
SQLiteConnection
类提供了一个LastInsertRowId
属性,该属性返回RowId
最后一次成功的插入操作。但是,如果某个线程有足够的运气在 评估期间将一些数据推送到表中LastInsertRowId
,我会得到一些错误的 Id(很可能不是我正在搜索的那个)。- SQLite 维护一个名为 的表
sqlite_sequence
,其中存储用于生成AUTOINCREMENT
键的值。我可以手动增加其中一个值,然后插入具有预定义 Id 值的行(我在 MySQL 中使用存储过程执行类似操作)。问题是,如果我希望这个解决方案是安全的,我必须从这个表中实现选择,增量和更新作为一个原子过程,我不知道该怎么做。 - SQLite 的 Android API 包含一个
insert
方法,该方法返回最后添加的行的 ID,但我在使用的包装器中找不到这样的方法。
所以问题是:如何以线程安全的方式检索最后添加的行的ID ?