mysql中的事务提交

2023-05-16

今天被问到了一个mysql自动事务提交的问题,就着这个问题对mysql的事务提交机制进行了一些研究,将测试的结果总结下。

一.mysql的自动事务提交设置

mysql中的自动事务提交是通过参数autocommit配置的,系统默认设置值为1,即开启状态

如果要关闭事务自动提交,执行下述SQL语句:

set autocommit=0;

二.各个事务提交状态与显式事务提交的关系

以student表为例说明,建表语句如下:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `clazz_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

1.在autocommit=0,即自动事务提交状态关闭的情况下,必须要执行commit语句,更新才做才会保存到数据库;

如果sql语句如下:

set autocommit=0;#关闭事务的自动提交
insert into student(name,age,clazz_id) values('zhangsan',28,3);

则执行上述的语句后,查询数据库,发现并没有姓名为zhangsan的记录,说明insert操作并没有保存到数据库。需要执行commit才会真正保存到数据库。

set autocommit=0;#关闭事务的自动提交
insert into student(name,age,clazz_id) values('zhangsan',28,3);
commit;

执行上面的sql后,查询数据库可以查询到zhangsan的记录,执行commit操作后,insert操作才保存到数据库。

对于多条insert的操作:

set autocommit=0;#关闭事务的自动提交
insert into student(name,age,clazz_id) values('lisi',28,3);
insert into student(name,age,clazz_id) values('wangwu',28,4);
commit;

数据库也可以查询出记录,没有begin语句,只有commit语句,这里的多条insert是不是为同一个事务有待考察。

2.在autocommit=1,即自动事务提交状态为开启的情况下,不执行commit语句,更改也会保存到数据库,并且各条更改操作是独立的事务,而不是同一个事务。

set autocommit=1;#开启事务自动提交
insert into student(name,age,clazz_id) values('zhaoliu',28,3);

执行上述sql后,查询数据库zaholiu的记录已经存在,说明开启自动事务提交情况下,不显式执行commit提交,mysql也会隐式的帮我们提交事务。

set autocommit=1;#开启事务自动提交
insert into student(name,age,clazz_id) values('tianqi',28,4);
insert into student(name,age,clazz_id) values('wangba',28,3);

执行语句中有多个更新操作时,上述的两个insert操作是两个独立的事务,即当第一条insert语句成功,第二条insert语句执行失败的情况下,第一条sql语句不会回滚,数据库中可以查询到tianqi的记录。

到这里总结一:在没有begin,即没有手动开启事务的情况下,autocommit=0时,commit手动提交才会保存到数据库;autocommit=1时,数据库会自动的将更新保存到数据库。

3.考虑手动开启事务的情况,即出现begin的情况

autocommit=0的情况

set autocommit=0;#关闭事务的自动提交
begin;
insert into student(name,age,clazz_id) values('lili',28,3);

执行后数据库查询不到lili记录,手动开启事务后,不执行commit更改不会保存到数据库

set autocommit=0;#关闭事务的自动提交
begin;
insert into student(name,age,clazz_id) values('lili',28,3);
commit;

数据库查询到lili记录,说明autocommit=0情况下,有begin必须有commit才会提交。

autocommit=1的情况

set autocommit=1;#开启事务自动提交
begin;
insert into student(name,age,clazz_id) values('jia',28,4);

数据库查询不到记录,手动开启事务后,不执行commit更改不会保存到数据库。

set autocommit=1;#开启事务自动提交
begin;
insert into student(name,age,clazz_id) values('jia',28,4);
commit;

数据库可以查询到记录,autocommit=1情况下,也要commit才会保存到数据库

总结第二点:在手动开启事务的情况下(即出现begin),不论自动提交状态是关闭还是打开,都需要commit提交更改才会保存到数据库。

参考:https://blog.csdn.net/jeaforea/article/details/51994636

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

mysql中的事务提交 的相关文章

  • 如何在 MySQL 中启用严格 sql_mode?

    我怎样才能启用严格sql mode在 MySQL 中 我想从 SQL 中获取数据并在中处理相同的数据strict mode 我现在的sql mode is mysql gt SELECT sql mode sql mode NO ENGIN
  • 表头在 php 中的 for 循环中重复

    我正在尝试从数据库创建排行榜 我将数据打印在列表中 当我尝试将此数据放入 html 表中时 标题在每次数据输入后都会重复 这是 for 循环导致的 但我不知道如何只打印一次标题 然后将数据插入到每一行中 任何帮助将不胜感激 代码和结果的屏幕
  • SQL 查询按字母顺序对除一个之外的所有结果进行排序?

    我有一个小问题 我正在使用 SQL 数据库的结果填充选择标记 我想要的是最后一个添加为顶部条目 其余条目按字母顺序排序 所以它会返回 developerID developerName 40 ZZZ Dev 39 A Dev 38 Be N
  • 在 PHP 中比较字符串的方式与 MySQL 相同

    我将 varchar 存储在 utf8 MySQL 表中并使用 utf8 general ci 排序规则 我在 varchar 上有一个唯一索引 我想在 PHP 中进行字符串比较 这相当于 MySQL 对索引所做的操作 一个具体的例子是 我
  • MySQL 创建和更新时的 CURRENT_TIMESTAMP

    我想定义一个有 2 个 TIMESTAMP 字段的表 如下所示 CREATE TABLE msgs id INT PRIMARY KEY AUTO INCREMENT msg VARCHAR 256 ts create TIMESTAMP
  • 在 OS X 10.7 中找不到 Mysql 命令

    我无法让我的 mysql 在 os x 10 7 上启动 它位于 usr local mysql bin mysql 当我输入时 我得到命令未找到mysql version在终端中 我试过这个无法从 mac 命令行访问 mysql http
  • 如何为 MySQL 和 Postgres 编写不区分大小写的查询?

    我在本地运行 MySQL 数据库进行开发 但部署到使用 Postgres 的 Heroku Heroku 处理几乎所有事情 但我不区分大小写的 Like 语句变得区分大小写 我可以使用 iLike 语句 但我的本地 MySQL 数据库无法处
  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • MySQL获取最后10条记录中的第一条记录

    在Mysql中 我试图获取最后10条记录中最旧的记录 为了得到最后 10 个我会简单地做SELECT FROM table ORDER BY id DESC LIMIT 10 为了获得最旧的 我只需使用 ASC 顺序 我需要首先按 DESC
  • UNIX时间记录时区吗?

    我想问一下UNIX时间 UNIX时间是否记录时区 我将托管从美国芝加哥移至 JST 问题是我的整个 MySQL 数据库都有 UNIX 时间 芝加哥 美国时区 的记录 我有一个 PHP 代码来显示之前的时间 例如 3 天前 昨天等 当我搬到新
  • 使用 pip3 安装 mysqlclient 时遇到问题

    我正在尝试使用 Django 设置 python 3 6 环境 安装说明说我应该安装 mysqlclient 才能连接到 mySQL 我明白了 dennis django sudo H pip3 install mysqlclient Co
  • PDO::commit 之后使用 PDOStatement::rowCount 结果?

    在 MySQL 文档中 有一个关于使用的注释mysql affected rows事务提交后 http php net manual en function mysql affected rows php http php net manu
  • Rails 多租户架构,限制多个租户的访问范围

    目前我们有一个单租户数据库架构 MySQL 运行着超过 100 个数据库 我们使用 Apartment gem 切换子域上的数据库连接 一切都很顺利 然而 我们现在需要创建所谓的 伞 客户端 它可以访问一组现有客户端的所有数据 我不认为这对
  • 如何在 Laravel 中编写联合查询?

    我正在使用 laravel 5 0 并且我有 mysql 查询 SELECT surat masuk id surat surat masuk nomor surat FROM surat masuk WHERE EXISTS SELECT
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • Spark SQL/Hive 查询通过 Join 永远持续下去

    所以我正在做一些应该很简单的事情 但显然它不在 Spark SQL 中 如果我在 MySQL 中运行以下查询 查询将在不到一秒的时间内完成 SELECT ua address id FROM user u inner join user a
  • 更改Docker容器中的mysql密码

    我如何更改 docker 容器中的 root 密码 因为一旦我停止 mysql 服务 容器就会自动停止 我应该停止 mysql 容器并部署一个新容器吗 您可以使用正在运行的容器更改它docker exec session https doc
  • ejabberd 16.06 + mysql 5.5.50,消息历史记录不保存

    我使用ejabberd 16 06 mysql 5 5 50 消息历史记录没有保存 我的 ejabberd yml MySQL server odbc type mysql odbc server freldo odbc port 3306
  • RMySQL fetch - 找不到继承的方法

    使用 RMySQL 我想将数据从数据库加载到 R 中的数据帧中 为此 我使用以下代码 R连接数据库 con lt dbConnect MySQL user root password password dbname prediction h
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7

随机推荐

  • 2.6 常见关系数据库产品

    常见关系数据库产品 1 Oracle 应用广泛 功能强大 xff0c 分布式数据库系统 关系 对象 型数据库 2 MySQL 快捷 可靠 开源 免费 与PHP组成经典的LAMP组合 3 SQLServer 针对不同用户群体的五个特殊的版本
  • 结构体定义寄存器方法(很流行哦)

    ARM寄存器数量之多 xff0c 叹为观止 xff01 幸运的是 xff0c 它都是以模块分布 xff0c 再依托C语言的模块化编程 xff0c 用户就没有必要记忆那么多的寄存器名称了 xff01 拿LPC1114来说 xff0c 单片机内
  • 代码函数调用关系图

    代码函数调用关系 Graphviz 43 CodeViz http www linuxidc com Linux 2015 01 111501 htmCallgraph xff1a 静态分析 C 程序函数调用关系图cflow 43 grap
  • Python元组(tuple),字符串,读取文件。

    目录 tuple xff1a tuple格式 xff1a tuple和列表的区别 xff1a 查询类型小方法 xff1a string 字符串 xff1a 字符串格式 xff1a 三种格式的区别 xff1a 1 单引号 xff0c 双引号换
  • 各种课程教学安排

  • 驱动测试时出现can't open 的一种情况

    提前声明 xff1a 本程序是使用class device create函数导致的错误 xff0c 如果不是使用该函数不要对号入座 xff0c 谢谢 在今天编写完驱动程序 xff0c 然后使用测试程序测试时 xff0c 却出现了can 39
  • Ubuntu 20.04上安装ROS

    文章目录 前言一 Ubuntu 20 041添加ROS源2更新软件源3配置及更换最佳软件源4安装ROS5初始化rosdep6设置环境变量7安装rosinstall8验证是否安装成功 总结 前言 在虚拟机VMware上安装了Ubuntu 20
  • 头文件只能放变量的声明但是不能放定义

    一般的做法都是在头文件 h 中声明变量 xff0c 然后在源文件 c 中定义变量 如果在头文件中定义变量 xff0c 这个变量就有了实体 xff0c 如果a c和b c一起引用了头文件head h xff0c 就等于同时创建了两个同样名字的
  • 使用策略模式优化大量if...else代码

    一 场景 假如我们有一个订单业务 xff0c 根据会员的类型不同 xff0c 使用if else判断 xff0c 然后去执行不同的业务操作 xff0c 伪代码如下 xff1a span class token keyword public
  • 操作系统笔记

    1 操作系统的特性 xff1a 并发性 共享性 异步性和虚拟性 2 特权指令与非特权指令 xff1a xff08 1 xff09 特权指令 只能在管态才能执行的指令为特权指令 这些指令一般只有操作系统才能执行 xff0c 而一般用户程序不能
  • 【计算机网络原理】根据IP地址和子网掩码计算网络地址

    背景 最近做计算机网络原理真题 xff0c 根据ip地址和子网掩码计算网络地址的过程总结一下 计算步骤 1 将IP地址 xff0c 子网掩码转换为二进制 2 之后将两个二进制进行与运算 xff0c 再将结果转为十进制 与 xff1a 相应二
  • C++学习笔记命名冲突和命名空间介绍

    C 43 43 命名冲突和命名空间介绍 假设您是第一次开车去朋友家 xff0c 给您的地址是 Mill City 的 245 Front Street 到达米尔城后 xff0c 您拿出地图 xff0c 却发现米尔城实际上有两条不同的前街 x
  • Docker的网络模式和如何跨主机通信(转载链接)

    https blog csdn net smooth00 article details 82842234 utm medium 61 distribute pc relevant t0 none task blog BlogCommend
  • java面试题2

    编程题 xff1a 1 xff0e 现在输入n个数字 xff0c 以逗号 xff0c 分开 xff1b 然后可选择升或者降序排序 xff1b 按提交键就在另一页面显示 按什么 排序 xff0c 结果为 xff0c xff0c 提供reset
  • 总线带宽 - 计算

    计算步骤 xff1a 1个时钟周期 61 1 总线时钟频率 xff1b 总线传输周期 61 1个时钟周期 总线周期包含时钟周期个数 xff1b 总线带宽 61 每个总线周期传送的数据 总线传输周期 xff1b 单位转化 xff1a 1MHz
  • centos7.5部署高可用k8s(一) ---- 部署LB负载均衡haproxy+keepalived

    在centos7 5系统部署一个k8s高可用集群 k8s版本采用v1 15 2 docker版本18 09 根据官方的文档 xff0c 部署集群前首先要部署负载均衡器 xff0c 这里简要记录下LB负载均衡器的部署过程 环境说明 节点IP备
  • centos7.5部署高可用k8s(二) ---- 部署k8s v1.15.2

    部署好LB以后 xff0c 接下来就正式开始部署k8s 部署前准备 1 各个节点设置注解名和域名解析 xff0c 包括两个haproxy节点 root 64 k8s master01 hostnamectl set hostname k8s
  • centos7.5部署高可用k8s(三) ---- 外置etcd集群

    前面的高可用集群的etcd是与control plane部署在同一个节点上的 xff0c 两者会相互影响 xff0c etcd还有一种部署方式是与control plane分离部署 xff0c 提供更高的稳定性 这里部署一个3节点的etcd
  • 抢单模式的研究

    最近在做关于公司的一个社区的项目 xff0c 在其中用到了一些业务模式 xff0c 对这些模式的应用做一个简单的总结 这是一个类似滴滴的抢单模式的项目 xff0c 对于抢单模式的实现做一个小小的总结 主要用到了三个表 问题表q 问题流转表q
  • mysql中的事务提交

    今天被问到了一个mysql自动事务提交的问题 xff0c 就着这个问题对mysql的事务提交机制进行了一些研究 xff0c 将测试的结果总结下 一 mysql的自动事务提交设置 mysql中的自动事务提交是通过参数autocommit配置的