MySQL事务嵌套

mysql嵌套事务的坑 表结构:CREATE TABLE `t1` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `c1` int(11) NOT NULL,  `c2` int(11) NOT NULL,  `c3` int(11) NOT NULL,  PRIMARY KEY (`id`),  KEY `c1` (`c1`)) ENGINE=InnoDB AUTO_INCREME... 阅读详情

前言

MySQL 在开始某个事务的时候,会隐式提交上一个事务。所以 MySQL 本身是不支持事务嵌套的。

但 MySQL 也给我们提供了一个 SAVEPOINT 来做出类似事务嵌套的动作,我们将运用 SAVEPOINT 来帮助我们实现事务嵌套。

MySQL示例

准备一张表,用于测试。

CREATE TABLE `demo_transaction` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

部分回滚

-- 格式化
TRUNCATE demo_transaction;

-- 开启事务
BEGIN;

-- 插入一条数据
INSERT INTO `demo_transaction`(id) VALUES(1);

-- 开启 SAVEPOINT
SAVEPOINT t1;
INSERT INTO `demo_transaction`(id) VALUES(2);
-- 回滚 SAVEPOINT
ROLLBACK TO SAVEPOINT t1;

-- 提交事务
COMMIT;

这时候,查询一下表 demo_transaction,会看到表里只有一条数据。

因为 2 的那条数据已经被回滚了。

全部提交

-- 格式化
TRUNCATE demo_transaction;

-- 开启事务
BEGIN;

-- 插入一条数据
INSERT INTO `demo_transaction`(id) VALUES(1);

-- 开启 SAVEPOINT
SAVEPOINT t1;
INSERT INTO `demo_transaction`(id) VALUES(2);
-- 释放 SAVEPOINT
RELEASE SAVEPOINT t1;

-- 提交事务
COMMIT;

这时候,查询一下表 demo_transaction,会看到表里有两条数据。

全部回滚

-- 格式化
TRUNCATE demo_transaction;

-- 开启事务
BEGIN;

-- 插入一条数据
INSERT INTO `demo_transaction`(id) VALUES(1);

-- 开启 SAVEPOINT
SAVEPOINT t1;
INSERT INTO `demo_transaction`(id) VALUES(2);
-- 释放 SAVEPOINT
RELEASE SAVEPOINT t1;

-- 提交事务
ROLLBACK;

这时候,查询一下表 demo_transaction,会看到表里没有数据。

PHP实现

<?php
/**
 * Transactions
 */
trait Transactions
{
    /**
     * transaction nums
     *
     * @var integer
     */
    protected $transactionNums = 0;

    /**
     * begin transaction
     */
    public function beginTrans()
    {
        ++$this->transactionNums;
        if ($this->transactionNums == 1) {
            $this->getDB()->beginTransaction();
        } else {
            $this->query("ROLLBACK TO SAVEPOINT trans{$this->transactionNums}");
        }
    }

    /**
     * rollback transaction
     */
    public function rollback()
    {
        if ($this->transactionNums > 1) {
            $this->query("SAVEPOINT trans{$this->transactionNums}");
        } else {
            $this->getDB()->rollback();
        }
        --$this->transactionNums;
    }

    /**
     * commit transaction
     */
    public function commit()
    {
        while ($this->transactionNums > 1) {
            $this->query("RELEASE SAVEPOINT trans{$this->transactionNums}");
            --$this->transactionNums;
        }
        if ($this->transactionNums) {
            $this->getDB()->commit();
        }
        $this->transactionNums = 0;
    }
}

最后

梳理一下知识,免于踩坑。

PHP中实现MySQL嵌套事务的两种解决方案 一、问题起源 在MySQL的官方文档中有明确的说明不支持嵌套事务: 1. 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 阅读详情

相关推荐

mysql 事务嵌套

通过对mysql事务进行测试,还原了事务嵌套带来的后果,同时,引申出了利用savepoint来实现对事务进行部分提交的特性。

csdntestuser1的博客 4467

什么是MySQL事务嵌套

MySQL 事务嵌套是一种比较特殊、也不常见的现象。要注意事务相互影响的情况,确保数据安全性,同时避免在复杂业务逻辑中嵌套事务。

LoveSummer 1670

【自动驾驶端到端5:VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning】

从大规模人类驾驶演示中学习类人驾驶策略是有希望的。但是,规划的不确定性使得从驾驶演示中提取驾驶知识是有挑战性的。从统计学习的角度来看,动作(包括实际和速度)是高度随机的,受许多无法建模的潜在因素影响。

weixin_40000560的博客 1404

mysql嵌套事务

CREATE TABLE `ydy_test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; select * from information_schema.innodb_trx\G; start transaction; Insert into ydy_test values(1); --另一个会话..

wiscourper的博客 1687

宇树机器人G1二次开发:导览、起始点、目的地与完整示例

通过宇树G1 SDK的导航接口,开发者可以高效地实现机器人的自主移动功能。连接 -> 设置目标点 -> 发送命令 -> 监控状态。本文提供的完整示例涵盖了从环境搭建到代码实现的全部步骤,并解释了起始点、目的地等关键概念。开发者可以在此基础上,结合多目标点巡逻、动态避障(需高级配置)等功能,构建更复杂的机器人应用。建议读者先在小范围、熟悉的平坦环境中测试,成功后再逐步扩展到更复杂的场景。

m0_52645558的博客 747

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 446

数据库嵌套事务的实现

这里额外多说一句,Spring的事务是通过代理实现的,所以要在使用中要额外注意,我之前看同事的代码就会经常出现事务失效的问题,出现最多的就是类的内部调用,即某个方法调用同一个类中的某个被Transactional装饰的方法,这肯定是失效的,因为其绕过了代理,直接调用的是目标对象的方法。不过我们可以借助savepoint来实现嵌套事务,目前很多的应用框架都通过savepoint实现了事务嵌套,比如著名的laravel,这是php领域内的一个比较牛逼的web框架,地为堪比JAVA的spring。

hbnn111的专栏 1209

TSMaster实战:如何用LIN总线唤醒你的汽车电子系统(附波形分析)

本文通过TSMaster工具实战解析LIN总线唤醒机制。详细介绍了LIN网络唤醒的协议要求、时序参数计算,并演示了如何在TSMaster中配置唤醒信号、捕获分析波形,以及验证休眠流程。文章结合常见问题排查,为汽车电子工程师提供了从理论到实践的完整调试指南。

weixin_28308325的博客 460

php 嵌套 mysql_PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套_PHP教程

PHP中实现MySQL嵌套事务的两种解决方案,mysql嵌套一、问题起源在MySQL的官方文档中有明确的说明不支持嵌套事务:1. Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a STAR...

weixin_35170789的博客 213

北斗三号PPP-B2b信号实战指南:从接收机配置到精度验证全流程

本文提供了北斗三号PPP-B2b信号从硬件配置到数据处理的全流程实战指南。详细解析了信号特性、接收机关键参数设置,并以飞纳接收机和Mass软件为例,演示了数据解算与精度验证方法。通过覆盖中国多地区的联调测试案例,验证了PPP-B2b服务可实现分米级实时定位精度,为无网络地区高精度应用提供了可靠解决方案。

nn3456的博客 553

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构

本文记录的是基于的YOLOv11网络模型轻量化方法研究。GhostNet中的Ghost模块和Ghost瓶颈结构是其轻量化的关键。Ghost模块克服了传统卷积层计算资源需求大的问题,Ghost瓶颈则合理设计了通道数量的变化以及与捷径连接的方式,能更好地在减少计算成本的同时保持较高性能,从而提升模型在移动设备上的应用能力和效率。

Limiiiing的博客 1430

mysql 事务嵌套事务_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...

weixin_31321157的博客 1192

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 115

MySQL 事务嵌套

MySQL默认自动提交(autocommit=1),如果要开启事务,先关闭自动提交(autocommit=0); InnoDB支持事务,MyISAM不支持; MySQL不支持事务嵌套;已经开启事务后,再开启事务(start transaction),会隐式的提交(commit)上一个事务。 MySQL中可以通过部分事务(savepoint)来实现嵌套 TRUNC...

weixin_30532837的博客 575

Unity3D实现项目限制功能(使用次数限制和时间限制)

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。在软件开发的时候,可能会遇到程序的使用次数限制,以及时间的限制,下面就写一下这两种方法是新建注册表,增加键值对,修改键值,完成对程序的控制提示:以下是本篇文章正文内容,下面案例可供参考以上就是讲了两种限制方法不定时更新Unity开发技巧,觉得有用记得一键三连哦。

心疼你的一切博客 1811

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mysql 事务嵌套_MySQL嵌套事务所遇到的问题

MySQL是支持嵌套事务的,但是没多少人会这么干的…. 前段时间在国外看到一些老外在争论MySQL嵌套事务的场景必要性。 逗死我了, 这嵌套的鬼畜用法还有啥场景必要性。 跟以前的dba同事聊过, 得知,在任何场景下都不要使用MySQL嵌套的事务。那么使用MySQL嵌套事务会遇到什么问题 ?mysql> select * from ceshi;+------+| n |+------+|...

weixin_34571972的博客 581

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

thinkphp mysql嵌套查询_MySQL 嵌套事务、PHP+MySQL嵌套事务、ThinkPHP 嵌套事务、Laravel 嵌套事务...

MySQL 嵌套事务、PHP+MySQL嵌套事务、ThinkPHP 嵌套事务、Laravel 嵌套事务在 MySQL 的官方文档中有明确的说明不支持嵌套事务:Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when yo...

weixin_28746213的博客 483

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

嵌套事务导致mysql死锁_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...

weixin_39902598的博客 583

mysql 不同连接的事务 会嵌套_事务嵌套的解决之道

前言我们在开发一个复杂的系统时可能经常出现这样的场景:比如,A函数中调用了B函数,而A函数和B函数同时都使用了事务,这样就出现了事务嵌套。在MySQL的官方文档中有明确的说明MySQL是不支持嵌套事务的:Transactions cannot be nested. This is a consequence of the implicit commit performed for any curr...

weixin_39789094的博客 480

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

zhang8058的专栏 1118

MySQL嵌套事务的讨论

看MySQL Internals Manual文档有一段关于nest

的专栏 1万+

php的mysql事务嵌套,MySQL嵌套事务所遇到的问题

MySQL是支持嵌套事务的,但是没多少人会这么干的…. 前段时间在国外看到一些老外在争论MySQL嵌套事务的场景必要性。 逗死我了, 这嵌套的鬼畜用法还有啥场景必要性。 跟以前的dba同事聊过, 得知,在任何场景下都不要使用MySQL嵌套的事务。那么使用MySQL嵌套事务会遇到什么问题 ?mysql> select * from ceshi;+------+| n |+------+|...

weixin_42370927的博客 259

php的mysql事务嵌套,MySql中的事务嵌套

1、Mysql中的事务必须是InnoDB、Berkeley DB引擎,myisam不支持。2、Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务。3、Mysql默认是autocommit=1,也就是说默认是立即提交,如果想开启事务,先设置autocommit=0,然后用START TRANSACTION、 COMMIT、 ROLLBACK来使用具体的事务。...

weixin_33220360的博客 472

嵌套事务导致mysql死锁_MySQL嵌套事务所遇到的问题

mysql是支持嵌套事务的,但是没多少人会这么干的…. 前段时间在国外看到一些老外在争论mysql嵌套事务的场景必要性。 逗死我了, 这嵌套的鬼畜用法还有啥场景必要性。 跟以前的dba同事聊过, 得知,在任何场景下都不要使用mysql嵌套的事务。那么使用mysql嵌套事务会遇到什么问题 ?mysql> select * from ceshi;+------+| n |+------+|...

weixin_32641973的博客 880
上一篇: Golang学习笔记之使用Redis
下一篇: go.mod 使用私有依赖
IMJCW
博客等级 码龄10年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值