2013-07-13 62 views
2

的檢索ID我面對檢索最後添加的行ID的一般問題。問題是,我希望此操作儘可能原子化,以完全線程安全。我在SQLite周圍使用了ADO.NET wrapperSQLite的 - 最後一排

這是我的研究:

  • SQLiteConnection類提供了一個LastInsertRowId屬性,它返回上次成功插入操作的RowId。但是,如果某個線程had enough luckLastInsertRowId評估過程中的一些數據推到表,我會得到一些錯誤的ID(最有可能不是一個我在尋找)。
  • SQLite的維護稱爲sqlite_sequence表,其中存儲用於產生AUTOINCREMENT鍵的值。我可以手動增加其中一個值,然後插入一行預定義的Id值(我在MySQL中使用存儲過程做這樣的事情)。問題是,如果我想這個解決方案是安全的,我不得不從這個表中,增量和更新作爲一個原子過程實施選擇,我不知道該怎麼做。
  • SQLite的Android的API包含insert方法,它返回最後添加的行的ID,但我不能找到我使用包裝這樣的方法。

所以,問題是:如何在一個線程安全的方式 retreive最後添加的行的ID?

回答

2

我們處理這個問題的方法是啓動一個事務,執行插入或更新,執行SELECT last_insert_rowid()(獲取它的結果),然後提交事務。

這應該是原子由於交易的性質和該操作返回當前的連接,而不是數據庫的任何其他連接信息的事實。