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