C++ 使用SQLite3 API(C+;+;)的线程安全最后一次插入rowid
我有一个程序,可以处理带有线程的数据库(根据用户请求)。但有一个问题: 虽然这是不可能的,但当例如将用户(他的详细信息)插入数据库时,我希望使用C++ 使用SQLite3 API(C+;+;)的线程安全最后一次插入rowid,c++,multithreading,sqlite,C++,Multithreading,Sqlite,我有一个程序,可以处理带有线程的数据库(根据用户请求)。但有一个问题: 虽然这是不可能的,但当例如将用户(他的详细信息)插入数据库时,我希望使用sqlite3\u int64 sqlite3\u last\u insert\u rowid(sqlite*)找出他的标识符列值(anint)时,可能会出现问题函数 尽管API通常是线程安全的,但正如我所研究的,如果另一个线程在我插入我的API之后,但在我调用sqlite3\u last\u insert\u row\u id()之前,在同一个表中插入
sqlite3\u int64 sqlite3\u last\u insert\u rowid(sqlite*)找出他的标识符列值(anint
)时,可能会出现问题代码>函数
尽管API通常是线程安全的,但正如我所研究的,如果另一个线程在我插入我的API之后,但在我调用sqlite3\u last\u insert\u row\u id()之前,在同一个表中插入一行,则可能会出现问题
从:
如果一个单独的线程在运行sqlite3_last_INSERT_rowid()函数时对同一数据库连接执行新的插入,从而更改了最后一次插入的rowid,那么sqlite3_last_INSERT_rowid()返回的值是不可预测的,可能不等于旧的或新的最后一次插入的rowid
我如何防止这种情况
我可以对所有数据库访问进行互斥,但在当前阶段,这会很麻烦,这是唯一的方法吗
我也可以执行事务sql查询,但这会产生我想要的效果吗 为了防止多个线程相互干扰,您应该使用事务,并为每个线程使用一个数据库连接
如果您确实想在线程之间共享相同的连接,则需要一个互斥锁