是否允许在同一个Sqlite数据库连接中启动多个事务?

时间:2016-05-30 02:14:21

标签: c++ sqlite

我有一个多线程C ++应用程序,它使用Sqlite3作为数据库。我存储SQLite数据库连接和需要访问数据库的线程,使用相同的连接创建自己的事务。

我使用以下命令获取数据库连接。

const int errorCode =  sqlite3_open_v2(fileNameUtf8.c_str(), &Handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, Vfs->GetName().c_str()); 

但是当多个线程正在访问数据库时,我面临着在同一连接中启动多个事务的问题。当第二个线程尝试开始事务错误消息"无法在事务中启动事务"退回。

我认为SQLITE_OPEN_FULLMUTEX标志允许使用相同连接的多个线程的情况。我假设它甚至可能允许同一连接中的多个事务。

Sqlite3中是否有任何选项可以使用相同的SQLite数据库连接开始与不同线程对应的多个事务?

提前致谢。

2 个答案:

答案 0 :(得分:1)

同一个连接中的多个独立转换根本没有意义:因为您使用相同的连接,所以每个其他事务被数据库视为已存在的嵌套,因此错误。

但是如果你需要并发,你应该想知道SQLite是否是正确的工具。来自常见问题Appropriate Uses For SQLite :

  

SQLite不会与客户端/服务器数据库竞争。 SQLite与fopen()竞争。

以后

  

许多并发作家? →选择客户端/服务器

答案 1 :(得分:0)

在SQLite中,一个连接对应一个事务。 要获得单独的事务,您需要单独的连接。

只有当线程确保其事务和SQL语句不会相互干扰时,才能从多个线程访问一个连接。

另请阅读FAQ