BeginTransactionBlock执行BEGIN命令,执行该函数后事务状态可以有如下改变:
- 未处于事务块中进入常规事务块 TBLOCK_STARTED–>TBLOCK_BEGIN
- 处于隐含事务块转换为常规事务块 TBLOCK_IMPLICIT_INPROGRESS–>TBLOCK_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;
}
}