BeginTransactionBlock执行BEGIN命令,执行该函数后事务状态可以有如下改变:
void BeginTransactionBlock(void) { TransactionState s = CurrentTransactionState; switch (s->blockState) { /* We are not inside a transaction block, so allow one to begin. */ case TBLOCK_STARTED: s->blockState = TBLOCK_BEGIN; break; /* BEGIN converts an implicit transaction block to a regular one. (Note that we allow this even if we've already done some commands, which is a bit odd but matches historical practice.) */ case TBLOCK_IMPLICIT_INPROGRESS: s->blockState = TBLOCK_BEGIN; break; /* Already a transaction block in progress. */ case TBLOCK_INPROGRESS: case TBLOCK_PARALLEL_INPROGRESS: case TBLOCK_SUBINPROGRESS: case TBLOCK_ABORT: case TBLOCK_SUBABORT: ereport(WARNING,(errcode(ERRCODE_ACTIVE_SQL_TRANSACTION),errmsg("there is already a transaction in progress"))); break; /* These cases are invalid. */ case TBLOCK_DEFAULT: case TBLOCK_BEGIN: case TBLOCK_SUBBEGIN: case TBLOCK_END: case TBLOCK_SUBRELEASE: case TBLOCK_SUBCOMMIT: case TBLOCK_ABORT_END: case TBLOCK_SUBABORT_END: case TBLOCK_ABORT_PENDING: case TBLOCK_SUBABORT_PENDING: case TBLOCK_SUBRESTART: case TBLOCK_SUBABORT_RESTART: case TBLOCK_PREPARE: elog(FATAL, "BeginTransactionBlock: unexpected state %s",BlockStateAsString(s->blockState)); break; } }