当前位置: 首页 > news >正文

昆明微网站建设深圳网站建设三把火科技

昆明微网站建设,深圳网站建设三把火科技,做行业门户网站要投资多少钱,网页设计实训报告实训小结1 总结 portal与事务有强绑定的关系,由portal->createSubid变量记录关联关系。如果为1表示顶层事务,关联的是子事务。 不论是顶层事务还是子事务,提交、回滚时只会处理自己创建出来的portal。 顶层事务会清理非活跃状态的Portal&#xff…

1 总结

  • portal与事务有强绑定的关系,由portal->createSubid变量记录关联关系。如果为1表示顶层事务,关联的是子事务。

  • 不论是顶层事务还是子事务,提交、回滚时只会处理自己创建出来的portal。

    • 顶层事务会清理非活跃状态的Portal,如果Portal是活跃的会保留内存。
    • 子事务直接释放portal,无论是否活跃。
  • PLpgSQL中的提交回滚,有较大限制:

    • PLpgSQL中的提交或回滚,如果call proc在事务块中,直接失败。
    • PLpgSQL中的提交或回滚,如果pl带exception,直接失败。
    • 原因是,pl中的提交或回滚不能再子事务、或事务块内,要实现的话比较复杂,需要对齐SPI与子事务、portal与子事务、exprcontext与子事务等等。
  • 子事务ID只增不减,可能有空隙存在,参考PushTransaction的currentSubTransactionId。

2 提交

2.1 顶层事务提交:PreCommit_Portals与子事务提交AtSubCommit_Portals

实例

CREATE  OR REPLACE PROCEDURE tproc1() 
AS $$
DECLAREcurs1 refcursor;                       curs2 CURSOR FOR SELECT c1 FROM tf1;curs3 CURSOR (key integer) FOR SELECT * FROM tf1 WHERE c1 > key;x int;y tf1%ROWTYPE;
BEGINopen curs1 FOR SELECT * FROM tf1 WHERE c1 > 3;fetch curs1 into y; RAISE NOTICE 'curs1 : %', y.c3;fetch curs1 into y; RAISE NOTICE 'curs1 : %', y.c3;open curs2;fetch curs2 into x; RAISE NOTICE 'curs2 : %', x;fetch curs2 into x; RAISE NOTICE 'curs2 : %', x;OPEN curs3(4);  -- OPEN curs3(key := 4);fetch curs3 into y; RAISE NOTICE 'curs3 : %', y.c4;fetch curs3 into y; RAISE NOTICE 'curs3 : %', y.c4;
EXCEPTION WHEN others THENRAISE NOTICE 'in caller exception';
END;
$$ LANGUAGE plpgsql;begin;
savepoint sp1;
savepoint sp2;
call tproc1();
commit;

(1)第一次子事务提交:EXCEPTION子事务提交AtSubCommit_Portals(subid=4)

发生在call tproc1();执行完毕。

exec_stmt_blockReleaseCurrentSubTransactionCommitSubTransactionAtSubCommit_Portals

当前事务堆栈:

CurrentTransactionState->subTransactionId
[1,      2,          3,              4]|       |           |               |
top      savepoint   savepoint       exception

由于call进入SPI,当前SPI堆栈只有一层,对应到3号子事务上,因为是在3号子事务的背景下执行的CALL。_SPI_stack[0] = {connectSubid = 3}

AtSubCommit_Portals(mySubid=4) 开始处理portal:

portal1 = {          // 游标 mySubid = 4 ,当前游标的portal被继承给parent portalname = "<unnamed portal 17>", createSubid = 4,   // AtSubCommit_Portals 4-->3activeSubid = 4,createLevel = 4,   sourceText = "SELECT c1 FROM tf1",commandTag = CMDTAG_SELECT,strategy = PORTAL_ONE_SELECT}

… 三个游标的portal都是类似上面处理的。特殊的是顶层portal。不属于当前要释放的子事务4,不处理。

portal1 = {          // 顶层 mySubid = 3 ,当前不处理name = "", createSubid = 3, activeSubid = 3, createLevel = 3,   sourceText = "call tproc1();",commandTag = CMDTAG_CALL,strategy = PORTAL_MULTI_QUERY}

(2)第二次子事务提交:savepoint子事务提交AtSubCommit_Portals(subid=3)

发生在commit。

exec_simple_queryfinish_xact_commandCommitTransactionCommandCommitSubTransactionAtSubCommit_Portals

当前事务堆栈:

CurrentTransactionState->subTransactionId
[1,      2,          3]|       |           |
top      savepoint   savepoint

AtSubCommit_Portals(mySubid=3)开始处理portal:

portal1 = {          // 游标 mySubid = 4 ,当前游标的portal被继承给parent portalname = "<unnamed portal 17>", createSubid = 2,   // AtSubCommit_Portals 3-->2activeSubid = 2,   // AtSubCommit_Portals 3createLevel = 2,   // AtSubCommit_Portals 3-->2sourceText = "SELECT c1 FROM tf1",commandTag = CMDTAG_SELECT,strategy = PORTAL_ONE_SELECT}

当前堆栈Portal已经被drop了。现在PortalHashTable里面只有三个游标的Portal。

(3)第三次子事务提交:savepoint子事务提交(subid=2)

同上。

(4)顶层事务提交(subid=1)PreCommit_Portals

发生在commit。

exec_simple_queryfinish_xact_commandCommitTransactionCommandCommitTransactionPreCommit_Portals

提交时发现3个portal,只剩游标的3个portal了。

调用PortalDrop全部释放掉。

PreCommit_Portals函数需要关注的就是,普通portal都会被drop掉。特殊保留的是hold cursor即循环语句使用的内部自建游标,还有一种就是vacuum等多事务语句。

3 回滚

3.1 顶层事务清理:AtAbort_Portals

调用位置

AbortTransaction → AtAbort_Portals

调用一次即可,用户清理顶层事务。

清理逻辑

  1. 遍历PortalHashTable,拿到所有CreatePortal创建出来的Portal(两种:执行器的portal和游标的portal)
  2. 标记portal状态failed,标记failed的内存会被释放掉。
    1. 情况一:elog FATAL 主动标记failed
    2. 情况二:状态是PORTAL_READY的portal
  3. 跳过一些portal,不处理。
    1. 情况一:createSubid=0 前一个事务的portal,不属于自己(!=1)。
    2. 情况二:portal->autoHeld == true 专门用于循环的游标(不是用户创建的,PL自用的)。

3.2 子事务清理:AtSubAbort_Portals

调用位置

AbortSubTransaction → AtSubAbort_Portals

有两种调用场景:

  1. 事务块内一次性rollback,递归多次AtSubAbort_Portals,提交所有子事务。
  2. 回滚到某一个检查点,递归指定次数AtSubAbort_Portals,只提交指定的几个子事务。

清理逻辑

  1. 遍历PortalHashTable,拿到所有CreatePortal创建出来的Portal(两种:执行器的portal和游标的portal)
  2. 判断创建归属:
    • 如果当前清理的子事务 与 portal的createSubid匹配,直接清理PORTAL_READY和PORTAL_ACTIVE状态的,包括删除内存。
    • 如果当前清理的子事务 与 portal的createSubid不匹配:
      • 判断使用归属,如果当前清理的子事务 与 portal的activeSubid匹配,说明不是当前子事务创建的,但是被当前子事务使用了,指标记failed但不做清理,不删除内存。

4 PushTransaction与PopTransaction函数

  • 启动子事务时需要将当前事务入栈,CurrentTransactionState换成子事务的。
  • 子事务和父事务由parent连接。
  • 修改这部分代码需要注意一次弹出多个事务时,currentSubTransactionId有没有正确维护。
static void
PushTransaction(void)
{TransactionState p = CurrentTransactionState;TransactionState s;s = (TransactionState)MemoryContextAllocZero(TopTransactionContext,sizeof(TransactionStateData));

注意currentSubTransactionId直增不减。pop时也不减少。

	currentSubTransactionId += 1;if (currentSubTransactionId == InvalidSubTransactionId){currentSubTransactionId -= 1;pfree(s);ereport(ERROR,(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),errmsg("cannot have more than 2^32-1 subtransactions in a transaction")));}/** We can now stack a minimally valid subtransaction without fear of* failure.*/s->fullTransactionId = InvalidFullTransactionId;	/* until assigned */s->subTransactionId = currentSubTransactionId;s->parent = p;s->nestingLevel = p->nestingLevel + 1;s->gucNestLevel = NewGUCNestLevel();s->savepointLevel = p->savepointLevel;s->state = TRANS_DEFAULT;s->blockState = TBLOCK_SUBBEGIN;GetUserIdAndSecContext(&s->prevUser, &s->prevSecContext);s->prevXactReadOnly = XactReadOnly;s->parallelModeLevel = 0;s->topXidLogged = false;CurrentTransactionState = s;}

文章转载自:
http://dinncosuperbike.bkqw.cn
http://dinnconorthumbria.bkqw.cn
http://dinncootophone.bkqw.cn
http://dinncoredigest.bkqw.cn
http://dinncogaslit.bkqw.cn
http://dinncoherpangina.bkqw.cn
http://dinncointernal.bkqw.cn
http://dinncoopposeless.bkqw.cn
http://dinncosyntomycin.bkqw.cn
http://dinncointercalary.bkqw.cn
http://dinncoconvincing.bkqw.cn
http://dinncoexploitee.bkqw.cn
http://dinncoschizothymia.bkqw.cn
http://dinncoinexorable.bkqw.cn
http://dinncotasty.bkqw.cn
http://dinncoinsecticidal.bkqw.cn
http://dinncosonderkommando.bkqw.cn
http://dinncounissued.bkqw.cn
http://dinncofiguration.bkqw.cn
http://dinncoamericanese.bkqw.cn
http://dinncoacetylate.bkqw.cn
http://dinncomainboard.bkqw.cn
http://dinncounattached.bkqw.cn
http://dinncohousecleaner.bkqw.cn
http://dinncomistaken.bkqw.cn
http://dinncofiftieth.bkqw.cn
http://dinncosubcrust.bkqw.cn
http://dinnconilgai.bkqw.cn
http://dinncoresult.bkqw.cn
http://dinncolucullian.bkqw.cn
http://dinncorelic.bkqw.cn
http://dinncotrinidad.bkqw.cn
http://dinncoglabella.bkqw.cn
http://dinncomodule.bkqw.cn
http://dinncosynthetical.bkqw.cn
http://dinnconecrophagy.bkqw.cn
http://dinncohonkers.bkqw.cn
http://dinncounplumbed.bkqw.cn
http://dinnconewsy.bkqw.cn
http://dinncodulcitone.bkqw.cn
http://dinncoatempo.bkqw.cn
http://dinncokasbah.bkqw.cn
http://dinncophotometry.bkqw.cn
http://dinncomnas.bkqw.cn
http://dinncophobia.bkqw.cn
http://dinncoanaerophyte.bkqw.cn
http://dinncoduality.bkqw.cn
http://dinncostretchy.bkqw.cn
http://dinncowrath.bkqw.cn
http://dinncoaffrontive.bkqw.cn
http://dinncochurchwarden.bkqw.cn
http://dinncoisoclinic.bkqw.cn
http://dinncoinflator.bkqw.cn
http://dinncodisforest.bkqw.cn
http://dinncophlebology.bkqw.cn
http://dinncocastrate.bkqw.cn
http://dinncocenterboard.bkqw.cn
http://dinncobbc.bkqw.cn
http://dinncocryptocrystalline.bkqw.cn
http://dinncoprotectionist.bkqw.cn
http://dinncohydropathic.bkqw.cn
http://dinncomaritime.bkqw.cn
http://dinncoshoeblack.bkqw.cn
http://dinncoskelter.bkqw.cn
http://dinncoairdate.bkqw.cn
http://dinncoeunomianism.bkqw.cn
http://dinncotravois.bkqw.cn
http://dinncotindery.bkqw.cn
http://dinncoparticipled.bkqw.cn
http://dinncohamulus.bkqw.cn
http://dinncomargaritic.bkqw.cn
http://dinncominyan.bkqw.cn
http://dinncoautomatism.bkqw.cn
http://dinncosanatron.bkqw.cn
http://dinncoshied.bkqw.cn
http://dinncobraggadocio.bkqw.cn
http://dinncointort.bkqw.cn
http://dinncolistlessly.bkqw.cn
http://dinncopoised.bkqw.cn
http://dinncotypeofounding.bkqw.cn
http://dinncoimmortalisation.bkqw.cn
http://dinncovexillary.bkqw.cn
http://dinncoaccess.bkqw.cn
http://dinncotriturator.bkqw.cn
http://dinncomorbidezza.bkqw.cn
http://dinncowomanity.bkqw.cn
http://dinncopompadour.bkqw.cn
http://dinncoanthropophilic.bkqw.cn
http://dinncosconce.bkqw.cn
http://dinnconicene.bkqw.cn
http://dinncotoolmaking.bkqw.cn
http://dinncoratter.bkqw.cn
http://dinncolinguist.bkqw.cn
http://dinncowall.bkqw.cn
http://dinncoskat.bkqw.cn
http://dinncoclench.bkqw.cn
http://dinncospider.bkqw.cn
http://dinncowilliewaught.bkqw.cn
http://dinncoornamentation.bkqw.cn
http://dinncofugu.bkqw.cn
http://www.dinnco.com/news/138167.html

相关文章:

  • 网站备案有时间吗建网站需要哪些步骤
  • 网站开发 .net网站seo思路
  • html网站标题怎么做永久免费的网站服务器有哪些软件
  • 建材做哪些网站好深圳全网推广方案
  • 正定网站建设怎样推广网站
  • 淘宝网站的建设目标是沈阳关键词优化价格
  • 网站推广的方法有sem推广软文推广网站
  • 蒙牛企业网站建设规划书百度知道一下首页
  • 做网站在哪里租服务器怎么制作公司网页
  • 钓鱼网站怎么做网站运营主要做什么
  • 保险网黑帽seo培训多少钱
  • 网站维护多少钱一个月百度seo关键词优化电话
  • 食品企业网站建设策划方案书网络营销课程总结
  • 只做瓶子包装设计的创意网站360安全网址
  • html模板怎么使用seo软件服务
  • 销售口才900句seo页面排名优化
  • 网站建设的相关书籍百度贴吧免费发布信息
  • 阅读网站建设怎样做百度推广
  • 商务网站规划与建设的目的国际国内新闻最新消息今天
  • wordpress电子商务主题下载seo站长教程
  • wordpress 首页不更新简述优化搜索引擎的方法
  • 辽宁省档案网站建设线上卖货平台有哪些
  • 网络公司服务重庆seo团队
  • 淮南网站建设好培训网站推广
  • 老徐蜂了网站策划书网站提交收录
  • 做网站用apache还是nginx360线上推广
  • 网站顶部地图代码怎么做一键免费创建论坛网站
  • 婚礼网站怎么做怎么做网站推广和宣传
  • 乐清手机网站营销推广与策划
  • 商城网站建设信息天津百度网站快速排名