【问题标题】:Thread-safe last_insert_rowid with SQLite3 API (C++)使用 SQLite3 API (C++) 的线程安全 last_insert_rowid
【发布时间】:2015-10-11 01:08:51
【问题描述】:

我有一个程序可以处理带有线程的数据库(根据用户请求)。但是有一个问题:

虽然不太可能,但有可能出现问题,例如,将用户插入数据库(他的详细信息)并且我想使用 sqlite3_int64 sqlite3_last_insert_rowid(sqlite*); 函数找出他的标识符列值(int) .

尽管 API 通常是线程安全的,但正如我所研究的那样 - 如果另一个线程将一行插入同一个表之后我插入我的,但 之前可能会出现问题 我打电话给sqlite3_last_insert_row_id()

来自SQLite Documentation

如果在 sqlite3_last_insert_rowid() 函数正在运行时,一个单独的线程在同一数据库连接上执行新的 INSERT 并因此更改了最后一个插入 rowid,则 sqlite3_last_insert_rowid() 返回的值是不可预测的,并且可能不等于旧的或新的最后插入rowid。

如何防止这种情况发生?

我可以互斥我所有的数据库访问,但在当前阶段这会很麻烦,这是唯一的方法吗?

我也可以做一个 transaction-sql 查询,但这会产生我想要的效果吗?

【问题讨论】:

    标签: c++ multithreading sqlite


    【解决方案1】:

    为防止多个线程相互干扰,您应该使用事务,每个线程使用一个数据库连接。

    如果你真的想在线程之间共享相同的连接,你需要一个互斥体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多