gpt4 book ai didi

c++ - 线程安全的 last_insert_rowid 与 SQLite3 API (C++)

转载 作者:行者123 更新时间:2023-11-30 05:40:38 27 4
gpt4 key购买 nike

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

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

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

来自SQLite Documentation :

If a separate thread performs a new INSERT on the same database connection while the sqlite3_last_insert_rowid() function is running and thus changes the last insert rowid, then the value returned by sqlite3_last_insert_rowid() is unpredictable and might not equal either the old or the new last insert rowid.

如何防止这种情况?

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

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

最佳答案

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

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

关于c++ - 线程安全的 last_insert_rowid 与 SQLite3 API (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31541436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com