首页 > 编程语言 >浅谈一下ThinkPHP5.1实现事务嵌套的特性

浅谈一下ThinkPHP5.1实现事务嵌套的特性

时间:2023-05-12 17:33:04浏览次数:49  
标签:回滚 rollback 浅谈 savepoint 事务 嵌套 sql ThinkPHP5.1

前言:     

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

浅谈一下ThinkPHP5.1实现事务嵌套的特性_thinkphp

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

浅谈一下ThinkPHP5.1实现事务嵌套的特性_sql_02

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

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

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

浅谈一下ThinkPHP5.1实现事务嵌套的特性_php_03

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

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

浅谈一下ThinkPHP5.1实现事务嵌套的特性_sql_04

 

ThinkPHP5.1

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

1. 开启事务。

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

浅谈一下ThinkPHP5.1实现事务嵌套的特性_php_05

2. 提交事务。

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

浅谈一下ThinkPHP5.1实现事务嵌套的特性_sql_06

3. 回滚事务。

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

浅谈一下ThinkPHP5.1实现事务嵌套的特性_sql_07

    

浅谈一下ThinkPHP5.1实现事务嵌套的特性_php_08

标签:回滚,rollback,浅谈,savepoint,事务,嵌套,sql,ThinkPHP5.1
From: https://blog.51cto.com/u_11161174/6271490

相关文章

  • 浅谈 Node.js
    Node.js是什么?Node.js®是一个开源、跨平台的JavaScript运行时环境。官网:https://nodejs.org/zh-cn更多精彩内容,请微信搜索“前端爱好者“,戳我查看。Node.js≠JavaScriptNode.js中,没有BOM和DOM。Nodejs不是一门语言,只是一个跨平台的JavaScript运行时环境。Node......
  • 浅谈类型
    -----------部分内容摘抄自《TypeScript编程》-----------------1.any代表不确定变量的值属于什么类型,声明它是任意类型,可以赋予任意类型的值,但这就意味着ts倒退回js了,不建议使用。如果不声明类型,默认也是any。lettestAny:any;2.unknown同any,代表不确定变量的值属于什......
  • Thinkphp5.1允许uni-app的H5跨域请求接口解决方法
    情景:   uni-app使用vue框架开发混合APP,虽然APP或者小程序没有跨域,但希望就是写完这个既有H5,又有APP,小程序等,所以能通过后端解决跨域最好。但是不知道是vue的原因还是什么,在PHP接口基类中添加了header头完全不起作用。官方给出的方法也有,具体可以看https://uniapp.dcloud.io/ap......
  • flex 嵌套下 overflow: hidden 失效
    HTML结构<divclass="container"><divclass="header">header</div><divclass="main"><divclass="left">left</div><divclass="center">......
  • R语言用线性混合效应(多水平/层次/嵌套)模型分析声调高低与礼貌态度的关系|附代码数据
    全文下载链接:http://tecdat.cn/?p=23681最近我们被客户要求撰写关于线性混合效应的研究报告,包括一些图形和统计输出。线性混合效应模型与我们已经知道的线性模型有什么不同?线性混合模型(有时被称为"多层次模型"或"层次模型",取决于上下文)是一种回归模型,它同时考虑了(1)被感兴趣......
  • 浅谈一类反悔贪心的问题
    种树在长度为\(n\)的数列中选择至少\(k\)个数字,他们都有价值,使得没有相邻的数字被取到,且数字之和最大。求这个最大的数字之和。我们考虑一个反悔贪心,首先用一个链表来维护数列,然后,每次贪心的选择最大的数字,并标记左右不可用。但是这个贪心显然是错的,我们再直接将这三个......
  • 浅谈Ubuntu中的软件包
    1.前言还记得大学第一次接触Ubuntu和Linux的时候,觉得用apt安装想要的软件非常方便。但是有时候出现了问题,各种报错,自己又不懂原理,就会非常抓狂。现在稍微理解一点了,故以较为容易理解的方式记录在这里,方便他人。2.软件包与包管理器dpkgLinux里的软件就是一些可执行文件。就像......
  • 浅谈整除分块
    例题一\[\sum_{i=1}^n\lfloor\fracni\rfloor\\\]首先很容易想到直接求解,对于较大的数据,\(O(n)\)做法无法通过。注意到函数\(y=\lfloor\dfracnx\rfloor\)的图像如下:不难发现,随着\(x\)增大,\(y\)单调不增,这说明对于相同值的\(y\)总是分布在同一块区域。这启发我们根......
  • shell 获取嵌套的变量
    shell获取一个变量指向的拎一个变量的值 #!/bin/bashHa=12345Hb=asdfname=ap=`evalecho'$'H$name`echo$p#12345name=bp=`evalecho'$'H$name`echo$p#asdf......
  • 浅谈联网汽车安全漏洞
    ​“智能网联汽车存在内生共性问题,即软硬件的漏洞后门,基于此进行的网络攻击可以直接带来勒索、盗窃、大规模车辆恶意操控风险,还有数据泄露等网络安全事件。如果内生的漏洞后门问题不解决,系统自身难保,很难谈系统安全之上的数据安全、应用安全。”——中国工程院院士邬江兴随着汽......