PostgreSQL数据库事务系统Upper Layer——BeginTransactionBlock

PostgreSQL数据库事务系统Upper Layer——BeginTransactionBlock
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;
	}
}
上一篇:upper/lower_bound 的用法


下一篇:1-13 Burpsuite Intruder Options介绍