What is the meaning of "Fb::Error: A transaction has already been started"

What is the meaning of "Fb::Error: A transaction has already been started"

我有一个 Ruby 应用程序有时会崩溃并显示以下错误消息:

Fb::Error: A transaction has already been started)

我现在想知道这条消息是什么意思。我稍微搜索了一下,发现 Firebird 不支持嵌套事务。该消息可以暗示这一点吗?如果不是,这还有什么意思?

这不是 Firebird 错误消息。这是您正在使用的驱动程序中的错误消息。具体来说 here:

static void fb_connection_transaction_start(struct FbConnection *fb_connection, VALUE opt)
{
    char *tpb = 0;
    long tpb_len;

    if (fb_connection->transact) {
        rb_raise(rb_eFbError, "A transaction has been already started");
    }

    if (!NIL_P(opt)) {
        tpb = trans_parseopts(opt, &tpb_len);
    } else {
        tpb_len = 0;
        tpb = NULL;
    }

    isc_start_transaction(fb_connection->isc_status, &fb_connection->transact, 1, &fb_connection->db, tpb_len, tpb);
    xfree(tpb);
    fb_error_check(fb_connection->isc_status);
}

如果不深入熟悉此驱动程序,我猜问题是您正试图在已经有活动事务的连接上启动事务。

Firebird 本身支持单个连接上的多个并行事务,它支持 SQL 标准保存点形式的嵌套事务,但看起来您使用的驱动程序不支持此功能。

解决方案(或解决方法)似乎是在您已经有活动事务时不启动事务,或者在启动新事务之前先提交或回滚现有事务。