【问题标题】:Is it allowed to start multiple transactions in the same Sqlite database connection?是否允许在同一个 Sqlite 数据库连接中启动多个事务?
【发布时间】:2016-09-27 18:13:31
【问题描述】:

我有一个使用 Sqlite3 作为数据库的多线程 C++ 应用程序。我正在存储 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 数据库连接开始对应于不同线程的多个事务?

提前致谢。

【问题讨论】:

    标签: c++ sqlite


    【解决方案1】:

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

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

    另请阅读FAQ

    【讨论】:

      【解决方案2】:

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

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

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

      以后

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2015-09-13
        • 1970-01-01
        相关资源
        最近更新 更多