当前位置: 首页 > article >正文

【日常经验】Mysql中的某个存储过程中如果有查数据,存数据和删除数据,会自动在一个事务中吗

在 MySQL
中,存储过程中的查数据(SELECT)、存数据(INSERT/UPDATE)和删除数据(DELETE)操作不会自动在一个事务中执行。默认情况下,MySQL
对每条单独的 SQL 语句都视为一个独立的事务(如果自动提交模式开启的话)。这意味着,如果存储过程中的某个 SQL
语句执行失败,之前已经执行成功的 SQL 语句并不会自动回滚。

为了确保存储过程中的多个操作保持原子性,即要么全部成功,要么全部失败,你需要在存储过程中显式地使用事务控制语句。这通常包括以下几个步骤:

  • 关闭自动提交:在存储过程的开始,你可以使用 SET AUTOCOMMIT = 0; 语句来关闭自动提交模式。这样,MySQL 就不会在每条 SQL 语句执行后自动提交事务。
  • 开始事务:使用 START TRANSACTION; 或 BEGIN; 语句来显式地开始一个事务。这标志着事务的起点。
  • 执行 SQL 操作:在事务中执行你需要的 SQL 操作,包括查询、插入和删除等。
  • 提交或回滚事务:
    如果所有操作都成功执行,使用 COMMIT; 语句来提交事务,使更改永久保存到数据库中。
    如果发生错误或异常,使用 ROLLBACK; 语句来回滚事务,撤销所有已经执行的更改。
  • 恢复自动提交(可选):在存储过程的结尾,你可以使用 SET AUTOCOMMIT = 1; 语句来恢复自动提交模式,但这通常不是必需的,因为存储过程结束后,其上下文也会被销毁。
    下面是一个示例存储过程,展示了如何使用事务控制语句来确保多个操作的原子性:
DELIMITER //
 
CREATE PROCEDURE MyAtomicStoredProcedure()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        -- 在发生异常时回滚事务
        ROLLBACK;
    END;
 
    -- 关闭自动提交
    SET AUTOCOMMIT = 0;
 
    -- 开始事务
    START TRANSACTION;
 
    -- 查询数据(通常不需要回滚,但这里为了完整性展示)
    SELECT * FROM my_table WHERE some_column = 'some_value';
 
    -- 插入数据
    INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2');
 
    -- 删除数据
    DELETE FROM my_table WHERE another_column = 'another_value';
 
    -- 提交事务(如果没有异常发生)
    COMMIT;
 
    -- 注意:在存储过程结束时,自动提交模式通常不需要显式恢复,因为存储过程上下文会被销毁
    -- 但为了清晰起见,你也可以在这里加上 SET AUTOCOMMIT = 1;
END //
 
DELIMITER ;

在这个示例中,如果插入或删除操作失败,或者存储过程中发生了其他 SQL 异常,异常处理程序会被触发,并且事务会被回滚到开始状态。这样,就可以确保存储过程中的多个操作要么全部成功,要么全部失败,从而保持原子性。


http://www.kler.cn/a/405158.html

相关文章:

  • C:mbedtls库实现https双向认证连接示例_七侠镇莫尛貝大侠20241122
  • NVR录像机汇聚管理EasyNVR大华NVR管理平台:深耕视频监控市场的多元化兼容
  • XLNet——打破 BERT 局限的预训练语言模型
  • ant-design-vue中table组件多列排序
  • 《Python浪漫的烟花表白特效》
  • C07.L07.STL之映射.应用2.统计数字
  • AWTK VSCode 实时预览插件端口冲突的解决办法
  • ubuntu 之 安装mysql8
  • 如何用redis+lua来实现高并发限流,超时数据进行等待
  • 基于Java Springboot北京医疗企业固定资产管理系统
  • HTML5和CSS3新增特性
  • cocos creator 3.8 Node学习 3
  • 【spring】spring单例模式与锁对象作用域的分析
  • 【IOS】Undefined symbol: _OBJC_CLASS_$_PAGFile
  • Java通过calcite实时读取kafka中的数据
  • 学习threejs,通过SkinnedMesh来创建骨骼和蒙皮动画
  • WSL2 ubuntu配置redis
  • Simulink学习笔记【PID UG联动仿真】
  • 算法.图论-习题全集(Updating)
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View
  • 力扣 LeetCode 513. 找树左下角的值(Day8:二叉树)
  • [服务器] 腾讯云服务器免费体验,成功部署网站
  • PBDL (基于物理的深度学习)-Chapter 1
  • 深度学习day2-Tensor 2
  • 【Git】git从暂存区中移除文件
  • 山泽HDMI切换器:提升家庭娱乐与办公体验的利器