提交 b3d9db46 编写于 作者: T Tom Lane

Teach AbortOutOfAnyTransaction to clean up partially-started transactions.

AbortOutOfAnyTransaction failed to do anything if the state it saw on
entry corresponded to failing partway through StartTransaction.  I fixed
AbortCurrentTransaction to cope with that case way back in commit
60b2444c, but evidently overlooked that
AbortOutOfAnyTransaction should do likewise.

Back-patch to all supported branches.  It's not clear that this omission
has any more-than-cosmetic consequences, but it's also not clear that it
doesn't, so back-patching seems the least risky choice.
上级 422022b1
...@@ -3612,7 +3612,24 @@ AbortOutOfAnyTransaction(void) ...@@ -3612,7 +3612,24 @@ AbortOutOfAnyTransaction(void)
switch (s->blockState) switch (s->blockState)
{ {
case TBLOCK_DEFAULT: case TBLOCK_DEFAULT:
/* Not in a transaction, do nothing */ if (s->state == TRANS_DEFAULT)
{
/* Not in a transaction, do nothing */
}
else
{
/*
* We can get here after an error during transaction start
* (state will be TRANS_START). Need to clean up the
* incompletely started transaction. First, adjust the
* low-level state to suppress warning message from
* AbortTransaction.
*/
if (s->state == TRANS_START)
s->state = TRANS_INPROGRESS;
AbortTransaction();
CleanupTransaction();
}
break; break;
case TBLOCK_STARTED: case TBLOCK_STARTED:
case TBLOCK_BEGIN: case TBLOCK_BEGIN:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册