2

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

这是我的研究:

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

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

4

1 回答 1

2

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

这应该是原子的,因为交易的性质和这个操作返回当前连接的信息,而不是任何其他到数据库的连接。

于 2013-07-13T22:39:28.717 回答