使用SQLite3 API(C ++)的线程安全的last_insert_rowid

时间:2015-07-21 14:07:25

标签: c++ multithreading sqlite

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

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

即使API通常是线程安全的,就像我研究的那样 - 如果另一个线程在插入我的之后将一行插入同一个表,可能会出现问题,但之前我致电sqlite3_last_insert_row_id()

来自SQLite Documentation

  

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

如何防止这种情况?

我可以互相访问我的所有数据库访问权限,但在目前的阶段会非常麻烦,这是唯一的方法吗?

我也可以做一个transaction-sql查询,但是那会有我想要的效果吗?

1 个答案:

答案 0 :(得分:1)

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

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