PHP中实现MySQL嵌套事务的两种解决方案.docVIP

PHP中实现MySQL嵌套事务的两种解决方案.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档