我有C ++ 11应用程序,它使用多个线程。每个线程都可以读取或写入数据库,例如。做INSERT, UPDATE, DELETE, SELECT
。
我为SQLite启用了序列化模式,因此可以在线程之间共享连接。
但是,我不知道,如何运行查询。我可以通过sqlite3_prepare_v2
运行单个查询并创建语句吗?或者,我应该通过std::lock_guard<std::mutex>
添加自己的锁,并执行以下操作:
Thread #1
db.lock()
db.query("....").execute()
db.unlock()
Thread #2
db.lock()
res = db.query("....").select()
while(res) res.row()
db.unlock()
或者还有其他方法吗?我一直在寻找一些示例代码,但一无所获。
答案 0 :(得分:2)
&#34;线程安全&#34;意味着单个函数调用是安全的。但是,当来自多个线程的函数调用被交错时,这不会阻止一个线程修改另一个线程当前正在读取多个步骤的数据;这可能导致无意义的数据。
您必须确保多个线程不会同时尝试对不同的事务使用相同的连接对象。要么使用自己的锁(如代码所示),要么为每个线程使用单独的连接对象。
答案 1 :(得分:2)
在Serialized模式下,您无需手动锁定即可执行查询。根据SQLite文档:
在此模式下(使用SQLITE_THREADSAFE = 1编译SQLite时的默认模式),SQLite库本身将序列化对数据库连接和预准备语句的访问,以便应用程序可以自由使用相同的数据库连接或相同的预准备语句同时在不同的线程中。
您还可以考虑使用WAL来获得更多并发性。在这种模式下,读写可以同时进行。在连接字符串中包含journal mode=WAL
以启用它。