mysql中 SET autocommit=0 与 START TRANSACTION 的区别

2023-10-29

在MySQL中, SET autocommit=0;指事务非自动提交,自此句命令执行以后,每个SQL语句或者语句块所在的事务都需要显式调用commit才能提交事务。

  • 不管autocommit1还是0 :

    START TRANSACTION + commit数据才会生效,ROLLBACK会回滚。

  • autocommit0 时:

    有没有START TRANSACTION都没关系。

    只有当commit数据才会生效,ROLLBACK会回滚。

  • autocommit1时 ,如果没有START TRANSACTION, 调用ROLLBACK没有用的, 即便设置了SAVEPOINT。 也就是说, 必须设置START TRANSACTION才能回滚。

代码演示之前, 我们先建个table:

USE `test`;
CREATE TABLE `autocommit_trans`(
    `id` INT unsigned NOT NULL AUTO_INCREMENT,
    `user_name` varchar(20) NOT NULL,
    PRIMARY KEY(`id`)
) ENGINE=InnoDB;
INSERT INTO `autocommit_trans`(`id`, `user_name`)VALUES(1, 'aben'),(2, 'sky');
  1. SET autocommit=1 + START TRANSACTION: 回滚成功
SET autocommit =1;

DROP PROCEDURE IF EXISTS  `sp_autocommit1_trans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit1_trans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    START TRANSACTION;
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN 
        ROLLBACK to p1; -- 回滚到埋点 p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit1_trans`();

回滚成功

  1. SET autocommit=0 + START TRANSACTION: 回滚成功
SET autocommit =0;

DROP PROCEDURE IF EXISTS  `sp_autocommit0_trans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit0_trans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    START TRANSACTION;
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN 
        ROLLBACK to p1; -- 回滚到埋点 p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit0_trans`();

回滚成功

  1. SET autocommit=0 , 没有START TRANSACTION: 回滚成功
SET autocommit =0;

DROP PROCEDURE IF EXISTS  `sp_autocommit0_notrans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit0_notrans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    -- START TRANSACTION; -- 这里没有哦!
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN 
        ROLLBACK to p1; -- 回滚到埋点 p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit0_notrans`();

回滚成功

  1. SET autocommit=1 , 没有START TRANSACTION: 即使有埋点, 也无法回滚
SET autocommit =1;

DROP PROCEDURE IF EXISTS  `sp_autocommit1_notrans`;
DELIMITER $$
CREATE  PROCEDURE `sp_autocommit1_notrans`()
BEGIN
    -- 错误代码
    DECLARE err_code INTEGER DEFAULT 0;
    -- 如果sql执行异常, 或者警告, 或者数据不存在, 都设置错误代码为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND  SET err_code=1;

    -- START TRANSACTION; -- 这里没有哦!
    SAVEPOINT p1;  -- 设置埋点

    UPDATE `autocommit_trans` SET `user_name` = 'aben2' WHERE `id` =1; 
    UPDATE `autocommit_trans` SET `gender` = 'female' WHERE `id` =2; -- 栏位不存在, SQL错误
    UPDATE `autocommit_trans` SET `user_name` = 'john' WHERE `id` =3; -- 记录不存在

    IF err_code = 1 THEN
        ROLLBACK to p1; -- 回滚到埋点p1
    ELSE 
        COMMIT; 
    END IF;

END$$
DELIMITER ;

CALL `test`.`sp_autocommit1_notrans`();

回滚失败, 我们可以从结果中看到数据已经被修改:

每种情况的演示代码执行后, " SELECT * FROM autocommit_trans "即可确认是否回滚.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql中 SET autocommit=0 与 START TRANSACTION 的区别 的相关文章

  • 两个表中两个字段的总和

    我的数据库中有四个表 如下所示 表格发票 invcid customerid invoicedate tblInvc详细信息 ID invcid item itemprice itemquantity tblPay payid invcid
  • android-security :Google Play 警告:您的应用程序包含 SQL 注入问题

    作为我们应用程序的一部分 我们使用两个 contentProvider 但两者都受到 android exported false 的保护 但我们仍然收到一封 Google Play 警告邮件 您的应用程序包含 SQL 注入问题 他们提到的
  • 在类路径中使用通配符调用 java 失败

    我当前目录中有一些 jar 它们都需要位于类路径中 因此我想对类路径使用通配符约定 命令行是 java exe classpath org python util jython args 但是我收到这个错误 Exception in thr
  • 如何使用 Tomcat 启用浏览器缓存静态内容(图像、css、js)?

    如何使用 Tomcat 启用浏览器缓存静态内容 图像 css js 首选的解决方案是编辑 spring MVC 配置文件或 web xml 尝试 改变值
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • Java文本输出中的UTF-8编码问题

    我一直致力于测试高棉语 Unicode Wordbreaker 的各种解决方案 高棉语单词之间没有空格 这使得拼写检查和语法检查变得困难 以及从旧高棉语转换为高棉语 Unicode 我得到了一些源代码 现在在线 http www white
  • Spring 非托管 bean 的依赖注入

    我有一个非托管的 JPA 域类 它是通过实例化的new操作员 UserAccount account new UserAccount userRepository save account In my UserAccount类 我有一个be
  • 如何在不打开浏览器的情况下查看 Android 应用程序中的网页?

    嘿 我正在开发一个 Android 应用程序 我想连接到该应用程序内的网络 不过 我在某种程度上尝试过 WebView 但它在我的目录中显示的文件很好 但当连接到 google com 时 它显示错误 然后我添加了这个文件
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • Bool类型返回规则

    我使用 dapper ORM 所以我使用两个规则Query
  • 如何编写具有这种不寻常匹配标准的联接?

    我想要 左连接 一个表 以便值不仅连接到匹配行 而且还连接到任何后续的非匹配行 直到下一个匹配行 换句话说 我想用之前的非空值来填充空值 样本数据和期望结果 Table x id 1 2 3 4 5 Table y id val 1 a 4
  • 在大画布上滚动

    我需要一些帮助来了解滚动绘制到 Android 画布上的项目的基础知识 假设我想创建一个时间线 其中 0 处的时间是可视化的顶部 并且随着时间的增加 时间线继续呈现在上一个点下方 如果我想在 Android 上渲染它 我知道我可以通过重写
  • 有没有办法防止 Spring Boot 覆盖 bean?

    与春天的抽象可刷新应用程序上下文 http docs spring io spring docs current javadoc api org springframework context support AbstractRefresh
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • Android中计算两个时间之间的差异

    我有两个字符串变量 例如 StartTime 和 EndTime 我需要通过用 StartTime 减去 EndTime 来计算 TotalTime StartTime和EndTime的格式如下 StartTime 08 00 AM End
  • 使用 Oracle 数据库的 JOIN 语法进行更新

    首先 我执行以下 SQL 语句 drop table names drop table ages create table names id number name varchar2 20 insert into names values
  • 在 SQL 中用加号 (+) 显示正结果

    我有以下查询 SELECT CONVERT DECIMAL 11 1 SUM Column 1000 1 AS NAME FROM Table 我有 1000 1 的原因是我希望结果以千为单位显示并反转 负值作为正值 反之亦然 只有一位小数
  • Web 服务返回 java.lang.reflect.InitationTargetException

    我在向 java web 服务发出请求时收到上述消息 我们最初创建了一个 Java 控制台应用程序并手动提交了一个 xml 文件 当将其作为 Java 应用程序运行时 将使用 System out println 成功创建并显示响应 我们通
  • 如果垃圾收集器没有删除未引用的对象,它们还能运行吗?

    如果一个对象正在等待垃圾收集 但包含一个在该对象的最后一个引用更改时正在运行的线程 那么该线程是否仍会运行并且代码是否仍会执行 那么您是否可能有一堆应该删除的幽灵对象 但它们对您的代码产生了影响 你如何防止这种情况发生 有没有办法让对象知道
  • 从 Oracle 获取包方法和参数

    我正在寻找 Oracle 查询来获取 Oracle 包 过程的所有参数 我知道有一个视图或表可以提供此功能 但我似乎不记得它是什么 注意 我并不是要从 user objects 获取包列表 而是要获取包 中每个过程的数据类型和参数名称 Th

随机推荐

  • 设置Unity的帧率

    问题描述 Xsens接收数据的频率是30Hz 为了接收到正确 完整的数据 要将Unity的帧率换成30帧 第一种方法 点击Editor gt Project Setting gt Quality 将VSync Count那选择Every S
  • 测试框架pytest教程(4)运行测试

    运行测试文件 pytest q test example py 会运行该文件内test 开头的测试方法 该 q quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中 但如果写在类中 类名需要是Test开头 非Test开
  • C/C++中使用Base64编码解码(使用boost库)

    Base64是一种用64个字符来表示任意二进制数据的方法 用记事本打开exe jpg pdf这些文件时 我们都会看到一大堆乱码 因为二进制文件包含很多无法显示和打印的字符 所以 如果要让记事本这样的文本处理软件能处理二进制数据 就需要一个二
  • c++判断硬盘是否连接、修改指定盘符、读取配置文件、获取exe路径

    系统 win7 64 编译器 vs2010 mfc对话框程序 工程名 fixde 语言 c 涉及函数 GetPrivateProfileString 读取配置文件内容 类型为string GetDriveType 获取某驱动器状态 GetV
  • w5500 php,[W5500]搭建属于你的家庭网络实时监控

    图9 OV2640 SVGA模式下图像输出时序图 系统上电后 MCU配置OV2640的工作方式 在OV2640准备好图像后 VSYNC会被拉高一段时间 MCU通过PCLK上升沿中断按字节接收图像数据 接下来我们将对OV2640的初始化配置程
  • 编写测试用例的基本方法之边界值

    一般边界值分析是因为程序开发循环体时的取数可能会因为 lt lt 搞错 比如下面代码 for int i 0 i lt 100 i int j i 1 System out println 循环第 j 次 循环地做某件事情 这里的程序是循环
  • 如何点击按钮把光标定位到想要的el-input中

    1 el inpu
  • C语言-结构体面向对象编程技巧

    Keil4 C51工程网址 https yunpan 360 cn surl yrNkQSrCKyc 一 面向对象 面向对象是软件开发方法 是相对于面向过程来讲的 通过把数据与方法组织为一个整体来看待 从更高的层次来进行系统建模 更贴近事物
  • python3 数据类型归纳

    1 简介 1 1 python3 数据类型 类型 含义 示例 int 整型 1 float 浮点型 1 0 bool 布尔值 True或False complex 复数 a bj string 字符串 abc123 list 列表 a b
  • 别被骗了,win10家庭版MMC是无法创建管理单元的

    今天我的PC 是win10家庭版 无法出现gpedit msc 然后下载gpedit msc 后 又出现MMC无法创建管理单元 家庭版是没有组策略和注册表的 家庭版是没有组策略和注册表的 家庭版是没有组策略和注册表的 重要的事情说三遍 下面
  • 长轮询与长连接

    实现即时通讯主要有四种方式 它们分别是轮询 长轮询 comet 长连接 SSE WebSocket 它们大体可以分为两类 一种是在HTTP基础上实现的 包括短轮询 comet和SSE 另一种不是在HTTP基础上实现是 即WebSocket
  • Spring笔记【黑马】

    Spring day01 今日目标 掌握Spring相关概念 完成IOC DI的入门案例编写 掌握IOC的相关配置与使用 掌握DI的相关配置与使用 1 课程介绍 对于一门新技术 我们需要从为什么要学 学什么以及怎么学这三个方向入手来学习 那
  • 三点估算法评估开发工作量

    概述 开发人员在进行开发工作之前都需要给出一个工作量的评估 以便后续的工作任务可以基于该时间进行排期 大多数开发人员评估工作量主要是基于过往的工作经验拍脑袋决定 并会给自己预留出一定的Buffer时间 这样可能的问题就是过度依赖个人的开发经
  • selenium爬虫_selenium爬虫如何避免对isTrusted属性检测?

    1 前言 各位码友 有两天不见 想小码哥了没 哈哈哈 成都疫情在平静9个月之后 又死灰复燃 目前还未找到确切的源头 提醒各位成都的码友一定注意戴口罩 做好自我防护 相信有关部门的防疫措施 一起共渡难关 好了 今天咱们再继续selenium爬
  • MyBatis---缓存-提高检索效率的利器

    目录 让我们来看看官方文档 缓存 一 一级缓存 1 基本介绍 2 一级缓存 3 一级缓存失效分析 二 二级缓存 1 基本介绍 2 二级缓存快速入门 2 1快速入门 3 注意事项和使用陷阱 三 Mybatis 的一级缓存和二级缓存执行顺序 四
  • C++对象模型之内存区的使用

    对象模型是面向对象程序设计语言的一个重要方面 它会直接影响面向对象语言编写程序的运行机制及对内在的使用机制 因此了解对象模型是进行程序优化 的基础 分析一般意义上程序中的数据在内存中的分布 以及程序使用的不同种类的内存等基本的概念 了解对象
  • 第八章(3) 聚类:DBSCAN和簇评估

    基于密度的聚类寻找被低密度区域分离的高密度区域 传统的密度 基于中心的方法 数据集中特定点的密度通过对该点半径之内的点计数 包括本身 来估计 关键是确定半径 根据基于中心的密度进行点分类 稠密区域内的点 核心点 点的邻域由距离函数和指定半径
  • 微信小程序(十)之消息推送配置(token验证失败的解决方案)

    背景 微信小程序开发 准备使用模板消息做些事情 但是发现需要先在微信公众平台的开发 开发设置 消息推送做配置 然后我们后台人员就开始各种配置 但是一到验证token就报错 很是郁闷 然后各种排查 发现了最终原因 过程和代码如下 很多网站给出
  • datx 开启debug

    1 datax源码编译 编译 mvn U clean package assembly assembly Dmaven test skip true 2 创建mysql测试表 SET FOREIGN KEY CHECKS 0 Table s
  • mysql中 SET autocommit=0 与 START TRANSACTION 的区别

    在MySQL中 SET autocommit 0 指事务非自动提交 自此句命令执行以后 每个SQL语句或者语句块所在的事务都需要显式调用commit才能提交事务 不管autocommit 是1还是0 START TRANSACTION co