我有一个用线程处理数据库的程序(根据用户请求)。但是有一个问题:
虽然这是不可能的,但是例如,当用户将用户插入数据库(他的详细信息)并且我想找出他的标识符列值(int
)时,可能会出现问题。使用sqlite3_int64 sqlite3_last_insert_rowid(sqlite*);
函数。
即使API通常是线程安全的,就像我研究的那样 - 如果另一个线程在插入我的之后将一行插入同一个表,可能会出现问题,但之前我致电sqlite3_last_insert_row_id()
。
如果一个单独的线程在同一个数据库连接上执行新的INSERT,而sqlite3_last_insert_rowid()函数正在运行,从而更改了最后一个insert rowid,那么sqlite3_last_insert_rowid()返回的值是不可预测的,可能不等于旧的或新的最后一个插入rowid。
如何防止这种情况?
我可以互相访问我的所有数据库访问权限,但在目前的阶段会非常麻烦,这是唯一的方法吗?
我也可以做一个transaction-sql查询,但是那会有我想要的效果吗?
答案 0 :(得分:1)
为了防止多个线程互相干扰,您应该使用事务,并为每个线程使用一个数据库连接。
如果你真的想在线程之间共享相同的连接,则需要一个互斥锁。