php中实现mysql嵌套事务的两种解决方案

php中实现mysql嵌套事务的两种解决方案

ID:28447109

大小:77.00 KB

页数:7页

时间:2018-12-10

php中实现mysql嵌套事务的两种解决方案_第1页
php中实现mysql嵌套事务的两种解决方案_第2页
php中实现mysql嵌套事务的两种解决方案_第3页
php中实现mysql嵌套事务的两种解决方案_第4页
php中实现mysql嵌套事务的两种解决方案_第5页
资源描述:

《php中实现mysql嵌套事务的两种解决方案》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、PHP中实现MySQL嵌套事务的两种解决方案一、问题起源在MySQL的官方文档中有明确的说明不支持嵌套事务:代码如下:Transactionscannotbenested.ThisisaconsequenceoftheimplicitcommitperformedforanycurrenttransactionwhenyouissueaSTARTTRANSACTIONstatementoroneofitssynonyms.但是在我们开发一个复杂的系统时难免会无意中在事务中嵌套了事务,比如A函数调用了B函数,A函数使用了事务,并且是在事

2、务中调用了B函数,B函数也有一个事务这样就出现了事务嵌套。这时候其实A的事务就意义不大了,为什么呢?上面的文档中就有提到,简单的翻译过来就是:代码如下:当执行一个STARTTRANSACTI0N指令时,会隐式的执行—个commit操作。所以我们就要在系统架构层面来支持事务的嵌套。所幸的是在一些成熟的ORM框架中都做了对嵌套的支持,比如doctrine或者laravel。接下来我们就一起来看下这两个框架是怎样来实现的。友情提示,这两个框架的函数和变量的命名都比较的直观,虽然看起来很长,但是都是通过命名就能直接得知这个函数或者变量的意思,

3、所以不要一看到那么一大坨就被吓到了:)二、doctrine的解决方案首先来看下在doctrine中创建事务的代码(干掉了不相关的代码):代码如下:publicfunctionbeginTransaction()++$this-gt;_transactionNestingLevel;if($this-gt;_transactionNestingLevel==l){$this-gt;_conn-gt;beginTransaction():}elseif($this-gt;_nestTransactionsWithSavepoints){$

4、this-gt;createSavepoint($this-gt;_getNestedTransactionSavePointName()):}这个函数的第一行用一个_transactionNestingLevel来标识当前嵌套的级别,如果是1,也就是还没有嵌套,那就用默认的方法执行一下STARTTRANSACTION就ok了,如果大于1,也就是有嵌套的时候,她会帮我们创建一个savepoint,这个savepoint可以理解为一个事务记录点,当需要回滚时可以只回滚到这个点。然后看下rollBack函数:代码如下:publicfunc

5、tionrollBackO{if($this-gt;_transactionNestingLevel==0){throwConnectionException::noActiveTransaction0;}if($this-gt;_transactionNestingLevel==l){$this-gt;_transactionNestingLevel=0:$this-gt;_conn-gt;rollback();$this-gt;_isRollbackOnly=false:}elseif($this-gt;_nestTransact

6、ionsWithSavepoints){$this-gt:rollbackSavepoint($this-gt;_getNestedTransactionSavePointName()):—$this-gt;_transactionNestingLevel:}else{$this-gt;_isRollbackOnly=true:—$this-gt;_transactionNestingLevel;}可以看到处理的方式也很简单,如果level是1,直接rollback,否则就回滚到前面的savepoint。然后我们继续看下commit函

7、数:代码如下:publicfunctioncommit(){if($this-gt;_transactionNestingLevel==0){throwConnectionException::noActiveTransaction():if($this-gt;_isRollbackOnly){throwConnectionException::commitFailedRollbackOnly();}if($this-gt;_transactionNestingLevel==1){$this~gt:_conn-gt:commit():

8、}elseif($this-gt;_nestTransactionsWithSavepoints){$this-gt:releaseSavepoint($this-gt;_getNestedTransactionSave

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。