Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite-正在检索最后一行的ID_C#_Sqlite_Ado.net_Thread Safety - Fatal编程技术网

C# SQLite-正在检索最后一行的ID

C# SQLite-正在检索最后一行的ID,c#,sqlite,ado.net,thread-safety,C#,Sqlite,Ado.net,Thread Safety,我面临检索最后添加的行ID的常见问题。问题是,我希望此操作尽可能原子化,以完全线程安全。我在SQLite周围使用 这是我的研究: SQLiteConnection类提供了一个LastInsertRowId属性,该属性返回上次成功插入操作的RowId。然而,如果某个线程在计算LastInsertRowId期间将某些数据推送到表中,我将得到一些错误的Id(很可能不是我正在搜索的Id) SQLite维护一个名为SQLite\u sequence的表,其中存储用于生成AUTOINCREMENT键的值。

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

这是我的研究:

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

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

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

这应该是原子的,因为事务处理的性质以及此操作返回当前连接的信息,而不是任何其他到DB的连接的信息