SQLite - 检索最后一行的ID

时间:2013-07-13 22:31:41

标签: c# sqlite ado.net thread-safety

我面临检索最后添加的行ID的常见问题。问题是,我希望这个操作尽可能原子化,以完全线程安全。我在SQLite周围使用ADO.NET wrapper

这是我的研究:

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

所以问题是:如何以线程安全的方式检索最后添加的行的ID

1 个答案:

答案 0 :(得分:2)

我们处理这个问题的方法是启动事务,执行插入或更新,执行SELECT last_insert_rowid()(检索其结果),然后提交事务。

由于事务性质以及此操作返回当前连接的信息而不是与DB的任何其他连接这一事实,这应该是原子的。