加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

「MySQL数据库」事宜嵌套的办理之道

发布时间:2018-08-18 09:02:29 所属栏目:编程 来源:编码之道
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 媒介 我们在开拓一个伟大的体系时也许常常呈现这样的场景:好比,A函数中挪用了B函数,而A函数和B函数同时都行使了事宜,这样就呈现了事宜嵌套。在MySQL的官方文档中有明晰的声名My
技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战

「MySQL数据库」事宜嵌套的办理之道

 媒介

我们在开拓一个伟大的体系时也许常常呈现这样的场景:好比,A函数中挪用了B函数,而A函数和B函数同时都行使了事宜,这样就呈现了事宜嵌套。在MySQL的官方文档中有明晰的声名MySQL是不支持嵌套事宜的:

Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START TRANSACTION statement or one of its synonyms.

那我们该怎样办理MySQL的事宜嵌套题目呢?

办理要领

今朝,在PHP圈有两种较量通用的办理要领,一种是以Doctrine为代表的,配置回滚点的办理要领,一种是以Laravel为代表的,节制事宜次数的办理要领。

Doctrine的办理要领

Doctrine办理要领的焦点就是对回滚点的节制,如下:

「MySQL数据库」事宜嵌套的办理之道

Doctrine中开启事宜的要领

「MySQL数据库」事宜嵌套的办理之道

Doctrine中事宜回滚的要领

「MySQL数据库」事宜嵌套的办理之道

Doctrine中事宜提交的要领

Doctrine用一个_transactionNestingLevel来标识当前嵌套的级别,假如是1,也就是还没有嵌套,那就用默认的要领执行一下START TRANSACTION就ok了;假如大于1,也就是有嵌套的时辰,它会帮我们建设一个savepoint。这个savepoint可以领略为一个事宜记录点,当必要回滚时我们可以只回滚到这个点。

Laravel的办理要领

相对Doctrine而言,Laravel的办理要领轻微简朴粗暴,它奇妙的行使了一个 transactions属性来记录了挪用事宜的次数。在事宜开启,事宜提交和事宜回滚时,先判定transactions的属性值,只有当transactions的属性值为1时,才举办事宜操纵。如下:

「MySQL数据库」事宜嵌套的办理之道

在开启事宜时,我们先判定当前有几个事宜,假如是第一个,ok,事宜开始,不然就啥都不做。

「MySQL数据库」事宜嵌套的办理之道

在事宜提交时,也判定当前事宜个数,假如是第一个,ok,提交事宜,不然,就只将transactions属性值减一

「MySQL数据库」事宜嵌套的办理之道

在事宜回滚时,同样先判定当前事宜个数,假如是第一个,ok,回滚事宜,同时将transactions属性值置为0,不然,就只将transactions属性值减一。

在Laravel的办理要领中,在嵌套的内层内里现实上是木有真正的事宜的,只有最外层一个整体的事宜,固然简朴粗暴,可是也办理了在内层新建一个事宜时会造成commit的题目。

【编辑保举】

  1. 时刻序列数据库为何会溘然成为宠儿?
  2. 30个MySQL万万级大数据SQL查询优化能力详解
  3. 对数据库MySQL中的JOIN详解
  4. MySQL/InnoDB乐观锁气馁锁共享锁、排它锁行锁表锁死锁观念的领略
  5. MySQL在删除表时I/O错误缘故起因说明
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读