Postgresql";“无正在进行的交易”;
为什么在Postgresql";“无正在进行的交易”;,sql,postgresql,transactions,Sql,Postgresql,Transactions,为什么在COMMIT之后,即使我已使用START transaction明确启动了一个事务(与BEGIN的工作原理相同),我也会收到关于“没有正在进行的事务”的警告?对于此特定事务,这将在90%的时间内发生,但在其他时间,提交将成功。我用的是postgres 9.3。这是postgres日志: 2014-07-04 21:47:19 EST LOG: statement: START TRANSACTION; 2014-07-04 21:47:19 EST LOG: statement: S
COMMIT
之后,即使我已使用START transaction
明确启动了一个事务(与BEGIN
的工作原理相同),我也会收到关于“没有正在进行的事务”的警告?对于此特定事务,这将在90%的时间内发生,但在其他时间,提交将成功。我用的是postgres 9.3。这是postgres日志:
2014-07-04 21:47:19 EST LOG: statement: START TRANSACTION;
2014-07-04 21:47:19 EST LOG: statement: SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
2014-07-04 21:47:19 EST LOG: statement: SET autocommit = 1;
2014-07-04 21:47:19 EST LOG: statement: SET TIME ZONE 'UTC'
2014-07-04 21:47:19 EST LOG: statement: INSERT INTO "Users" (...) VALUES (...) RETURNING *;
2014-07-04 21:47:19 EST LOG: statement: INSERT INTO "Profiles" (...) RETURNING *;
2014-07-04 21:47:19 EST LOG: statement: SET TIME ZONE 'UTC'
2014-07-04 21:47:19 EST LOG: statement: INSERT INTO "Sessions" (...) VALUES (...) RETURNING *;
2014-07-04 21:47:20 EST LOG: statement: COMMIT;
2014-07-04 21:47:20 EST WARNING: there is no transaction in progress
您正在使用自动提交。使用自动提交时,显式启动事务是没有意义的
删除行“set autocommit=1”或将1更改为“off”或等效值,这样应该可以工作。确定它们是同一个会话吗?将
%p
添加到日志行前缀中
,然后重试。另外,什么样的客户端库、客户端应用程序?对于失败的启动事务
-提交
对,会话ID是不同的,它们在工作时是相同的。这可能是问题所在吗?会话是否需要相同?抱歉,如果这是一个愚蠢的问题;我不知道交易在幕后是如何运作的。我正在使用测试版2.0.0 ORM和node,这可能是问题所在,但我已经使用它一段时间了,没有任何问题,然后这种情况开始随机发生。“当使用自动提交时,显式启动事务是没有意义的。”-这不是真的。@horse\u和\u no\u名称取决于驱动程序中的自动提交实现。在许多情况下,它与BEGIN相同;承诺代码>-或开始;开始;承诺
.a\u horse\u with\u no\u name:Quote postgres documentation on autocommit:“此命令可以将会话更改为autocommit模式,其中每个语句都是隐式提交的。”这意味着,每个语句与BEGIN基本相同;陈述犯罪因此,增加额外的开始;犯罪命令不会改变任何东西。命令中说:“默认情况下(不带BEGIN
),PostgreSQL以“autocommit”模式执行事务,也就是说,每个语句在其自己的事务中执行,并在语句末尾隐式执行提交(如果执行成功,则执行回滚)”。如果我使用的是BEGIN
,那么autocommit没有任何意义,因为我明确地告诉postgres事务的开始和结束,对吗?