【发布时间】:2015-10-11 01:08:51
【问题描述】:
我有一个程序可以处理带有线程的数据库(根据用户请求)。但是有一个问题:
虽然不太可能,但有可能出现问题,例如,将用户插入数据库(他的详细信息)并且我想使用 sqlite3_int64 sqlite3_last_insert_rowid(sqlite*); 函数找出他的标识符列值(int) .
尽管 API 通常是线程安全的,但正如我所研究的那样 - 如果另一个线程将一行插入同一个表之后我插入我的,但 之前可能会出现问题 我打电话给sqlite3_last_insert_row_id()。
如果在 sqlite3_last_insert_rowid() 函数正在运行时,一个单独的线程在同一数据库连接上执行新的 INSERT 并因此更改了最后一个插入 rowid,则 sqlite3_last_insert_rowid() 返回的值是不可预测的,并且可能不等于旧的或新的最后插入rowid。
如何防止这种情况发生?
我可以互斥我所有的数据库访问,但在当前阶段这会很麻烦,这是唯一的方法吗?
我也可以做一个 transaction-sql 查询,但这会产生我想要的效果吗?
【问题讨论】:
标签: c++ multithreading sqlite