- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP中实现MySQL嵌套事务的两种解决方案
一、问题起源
在MySQL的官方文档中有明确的说明不支持嵌套事务: 代码如下:
Transactionscannotbenested. Thisisaconsequenceofthei mplicitcommitperformedforanycurrenttransactionwheny
ouissueaSTARTTRANSACTIONstatementoroneofi tssynonyms.
但是在我们开发一个复杂的系统时难免会无意中在事 务中嵌套了事务,比如A函数调用了 B函数,A函数使用了 事务,并且是在事务中调用了 B函数,B函数也有一个事务 这样就出现了事务嵌套。这时候其实A的事务就意义不大 了,为什么呢?上面的文档中就有提到,简单的翻译过来 就是:
代码如下:
当执行一个STARTTRANSA CTI0N指令时,会隐式的执行 —个commi t操作。
所以我们就要在系统架构层面来支持事务的嵌套。所 幸的是在一些成熟的ORM框架中都做了对嵌套的支持,比 如doctrine或者laravel。接下来我们就一起来看下这两
个框架是怎样来实现的。
友情提示,这两个框架的函数和变量的命名都比较的 直观,虽然看起来很长,但是都是通过命名就能直接得知 这个函数或者变量的意思,所以不要一看到那么一大坨就 被吓到了:)
二、doctri ne的解决方案
首先来看下在doctrin e中创建事务的代码(干掉了不 相关的代码):
代码如下:
publi cfunctionbe ginTransact ion()
++$this-gt ;_tr ansactionNe stingLevel; if ($this-gt ;_transac tionNesting Level==l) { $this-gt ;_conn-gt; beg inTransacti on ():
} els eif($this-g t;_nestTran sactionsWit hSavepoints ) {
$this-g t;createSav epoint ($thi s-gt;_getNe stedTransac tionSavePoi ntName ()):
}
这个函数的第一行用一个_transac tionNesting Level 来标识当前嵌套的级别,如果是1,也就是还没有嵌套,那
就用默认的方法执行一下ST ARTTRANSACT ION就ok 了,如 果大于1,也就是有嵌套的时候,她会帮我们创建一个 savepoint,这个savepoint可以理解为一个事务记录点, 当需要回滚时可以只回滚到这个点。
然后看下r ollBack函数:
代码如下:
publi cfunctionro llBackO
{
if ($this-gt ;_transacti onNestingLe vel==0) { t hrowConnect ionExceptio n: :noActive Transaction
0;
}
if ($t his-gt ;_tra nsactionNes tingLevel==l) { $this-gt ;_transac tionNesting Level=0:
$this-gt ;_co nn-gt ;rollb ack();
$th is-gt ;_isRo llbackOnly=false:
}el seif ($this- gt;_nestTra nsactionsWi thSavepoint s) {
$this- gt:rollback Savepoint($ this-gt;_ge tNestedTran sactionSave PointName ()):
—$this -gt ;_transa ctionNestin gLevel:
} els e {
$this-g t ;_isRollba ckOnly=true :
—$this-gt ;_transac tionNesting Level;
}
可以看到处理的方式也很简单,如果level是1,直 接rollback,否则就回滚到前面的s avepoint。
然后我们继续看下commi t函数:
代码如下:
publicfunct ioncommit ()
{
if ($this -gt ;_transa ctionNestin gLevel==0) { throwConn ectionExcep tion::noAct iveTransact
ion():
if ($this-gt;_isRollbackO nly) { thro wConnection Exception:: commitFaile
dR
您可能关注的文档
最近下载
- (推荐!)人教版音乐二年级上册《报灯名》教案教学设计.pdf VIP
- 2025兴业银行总行国际业务部交易银行部招聘笔试参考题库附答案解析.docx VIP
- 一种利用酿酒废水和秸秆制备有机肥的方法.pdf VIP
- 人教版小学数学一年级下册全册教案(2024年3月修订).docx VIP
- 力劲DCC400吨压铸机说明书.pdf VIP
- 2025兴业银行总行国际业务部交易银行部招聘考试含答案.docx VIP
- 2025兴业银行总行国际业务部交易银行部招聘笔试模拟试题及答案解析.docx VIP
- 英语报刊选读词汇特色.ppt VIP
- 2025兴业银行总行国际业务部交易银行部招聘笔试含答案.docx VIP
- 2025兴业银行总行国际业务部交易银行部招聘考试备考试题及答案解析.docx VIP
原创力文档


文档评论(0)