第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

淺談一下ThinkPHP5.1實(shí)現(xiàn)事務(wù)嵌套的特性

標(biāo)簽:
PHP ThinkPHP

前言:

在我们平时做的一个项目中,线上环境突然发现数据库被锁住。导致很多有关数据插入和修改的接口全都瘫痪,项目基于ThinkPHP5.1。报错的时候,我们发现了一条sql错误日志,如下。

根据错误信息提示,是说有一个事务回滚时没有找到savepoint 的暂存点。所以问题应该是事务嵌套导致的,目前Think[PHP]5封装的数据层方法是有对事务嵌套进行处理。而MYSQL到底支不支持事务嵌套呢?伪代码如下。

执行完后出现了操作1的数据真正写入,只有操作2的数据回滚了。在第一个事务没有提交或回滚时,再开启第二个事务时,会自动提交第一个事务。 这明显不符合心理预期,而且也无法回滚一部分操作。首先,调用多次begin的写法,在MySQL里肯定是无法首先事务嵌套的。

抱着疑问,我去网上也查了很多类似的问题。却意外的发现关于“解决事务嵌套的方法”都如此的雷同,清一色的 “开启事务时候使用单例,检查事务是否存在”。(蒙圈……)

继续回到MYSQL是否支持事务嵌套,最后我了解到MySQL中有一个叫savepoint和rollback to的语句。于是我顺手举了个例子。

上面有3张表,分别有不同的更新操作和最后的插入。但是最后只回滚到P1,执行完commit后,我发现只有p1位置的操作做了更新,后面的修改和插入全都没生效。可能savepoint和rollback to语句并不能称之为事务嵌套,也不能说MySQL是支持还是不支持事务嵌套。总之通过savepoint和rollback to,是可以用来达到一些事务嵌套特性的。

根据我们项目的日志,我也试着复现一下,故意rollback to到一个不存在的点上,最后commit时发现,数据库的第一条sql修改了,后面插入语句也添加成功了。

ThinkPHP5.1

所以再回到ThinkPHP5框架实现的事务嵌套,于是我打开了框架的Connection抽象类。最主要的就是下面部分了。

  1. 开启事务。

开启事务的部分加了次数累加,只要在代码块中使用了transaction就会被记录并叠加,当只有1时,才执行sql的begin,否则就savepoint记录一个保存点。

  1. 提交事务。

判断了只有等于1才对事务进行提交,也就是在代码中最后面的commit才生效,使用一次减一次嵌套计数。initConnect方法主要是对分布式数据库和单机对读写连接的判断。

  1. 回滚事务。

回滚主要也是当计数等于1才让sql执行rollback,否则(也就是嵌套了)就让连接资源回滚到执行的保存点。它里面的就是使用的rollback to p1 语句的。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消