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 标准保存点形式的嵌套事务,但看起来您使用的驱动程序不支持此功能。
解决方案(或解决方法)似乎是在您已经有活动事务时不启动事务,或者在启动新事务之前先提交或回滚现有事务。
我有一个 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 标准保存点形式的嵌套事务,但看起来您使用的驱动程序不支持此功能。
解决方案(或解决方法)似乎是在您已经有活动事务时不启动事务,或者在启动新事务之前先提交或回滚现有事务。