微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐