mysql InnoDB事务

2023-05-16

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
参考书籍《mysql是怎样运行的》
以及极客时间《mysql实战45讲》
本文总结事务相关的概念,事务相关的命令等,具体持久性,原子性,隔离性如何实现,会在后续的学习中进行补充

系列文章目录和关于我

一丶事务

上一篇关于buffer pool的学习中,我们学习Buffer pool相关知识,innodb再对某个页面进行读写访问时,会将这个页面读到buffer pool 中,之后如果修改了某个页面,也不会立即刷新到磁盘,而只是将缓冲页面的控制块添加到flush 链表中,之后某个时间点(后台定时任务线程每隔一定时间将flush 链表中的脏页刷新到磁盘,或者新的页面需要缓冲,将LRU链表中一些脏页刷盘)。那么如果mysql服务突然崩溃,或者服务器突然断电,岂不是已经提交的事务将丢失?

事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消

这里保证已经提交事务一定可以持久化到磁盘的就是redo log。类似如果事务执行到一半需要回滚如何实现昵,这就是undo log实现的版本控制链的作用。

二丶事务特性

1.原子性

要么多个操作都执行,要么多个操作都不执行,不可存在中间状态。但是现实世界中一个业务存在多个步骤,这些步骤抽象为数据库操作又存在多个,一个数据库操作又可分为多步(比如先修改缓冲页,再刷新磁盘)任何一个时间点都可能发生意想不到的错误,使操作无法执行下去,所以需要保证:如果再执行过程中发生了错误,就把已经执行的操作恢复为执行前的样子。

2.隔离性

对于现实世界中状态转换对应的某些数据库操作来说,不仅仅需要保证原子性,还需要保证其他数据库操作造成状态转换不会影响到本次状态转换。这便是隔离性

3.一致性

只有符合约束的数据才是有效(年龄再符合规定的范围,房价不能为负数)如果数据中的数据全部符合现实世界的约束,我们就说这些数据具备一致性。如何实现一致性

  • 数据库本身可以保证一定的一致性(主键,唯一索引保证不可重复,申明某些列not null拒绝null值的插入)甚至可以定义一些触发器进行限定
  • 更多一致性操作,需要crud程序员进行限制

如果数据库操作不符合原子性(转钱扣了转账者,但是收款的人钱数没有增加)或者不符合隔离性(两个操作并发,第二个操作读到第一个操作没有提交的数据,然后第二个操作后写回,发生了脏写)这也是不符合一致性要求——数据库中原子性和隔离性都是保证一致性的一种手段

4.持久性

当现实世界中的一个状态转换完成后,这个转换结果需要永久保留,这称为持久性,现实世界中状态转换映射到数据中时,持久性意味着转换对应的数据需要持久化到磁盘中,无论发生什么事故,本次转换操作的影响都不应该丢失(损坏磁盘除外doge)

三丶事务的状态

  1. 活动的:事务对应的数据库操作正在执行过程中时
  2. 部分提交的:当事务中最后一个操作执行完成,但是由于操作都是在内存中执行,造成了影响没用刷新到磁盘时
  3. 失败的:事务处于活动状态或者部分提交时,约到某些错误而无法继续执行,或者任务终止事务的执行,事务就称为失败的
  4. 中止的:事务执行到一半,需要撤销对数据库造成的影响进行撤销,回滚,当回滚操作执行完毕,称为终止的
  5. 提交的:处于部分状态的事务对应操作刷新到磁盘,称为提交的

四丶mysql中的事务语法

1.开启事务

  • Begin
  • Start Transaction

该命令可以跟随如下修饰符,多个修饰符使用逗号分隔,如Start Transaction read only,with consistent snapshot

+ read only


标识当前事务是一个只读事务,属于该事务的数据库操作只能进行读操作(但是可以改当前会话中的临时表)(为什么只读还需要事务,因为需要获得一致性视图,不同的隔离级别会读到不同的数据,比如你想统计流水表中本月每一个顾客的消费信息,先统计了总流水Sum,然后依次统计每一个用户的流水,如果没用事务,第后续的对每一个顾客的统计之和可能读到最新的数据(用户新增了消费),而导致总流水和每一个用户流水之和不等的情况)
+ read write


标记当前事务是读写事务
+ with consistent snapshot


启动一致性读
begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作
InnoDB 表的语句,事务才真正启动。(一致性视图是在第执行第一个快照读语句时创建的)
如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令。(一致性视图是在执行 start transaction with consistent snapshot 时创建的)

2.提交事务

  • commit
  • commit work and chain

提交当前事务并开启下一个事务,如果执行 commit work and chain,则是提交事务并自动启动下一个事务,这样省去了再次执行 begin 语句的开销

3.手动中止事务

roll back ,程序员可以手段roll back进行回滚事务,如果事务在执行的过程中遇到一些错误,比如发生了死锁,会回滚整个事务

4.自动提交

mysql 有一个系统变量autocommit 来控制是否自动提交事务,如果不显示的使用开启事务的命令,那么每一条语句就视为一个独立的事务。关闭自动提交的方式有:手动开启事务,设置自动提交为OFF,这时候需要手动提交或者进行回滚。

6.隐式提交

mysql中如果输入了一些特定的语句,即便不是commit 命令也会提交事务。如

  • 执行ddl,定义数据库对象的命令,比如建立表,修改表,以及视图,存储过程等
  • 隐式的使用或者修改mysql数据库中的表

使用alter user,create user,drop user等语句的时候会提交前面语句属于的事务

  • 事务控制or关于锁定的语句

如果一个事务还没有提交,或者回滚的时候,又开启一个新事务,或者修改autocommit的值从OFF 到ON的时候也会提交事务。使用lock tables,unlock tables等关于锁定的语句也会提交事务

  • 加载数据的语句

比如使用load data等语句也会提交事务

  • 关于mysql复制的语句

比如start slave,stop slave也会提交事务

  • 其他语句

比如optimize table

7.保存点

savepoint 保存点名称,可以开启一个保存点,使用rollback to 保存点名称可以回滚到指定保存点,使用release savepoint 保存点可以释放保存点,保存点如同游戏的存档,避免我们从头开始,心态炸裂

五丶小心长事务

长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间(记录回滚信息的undo log,需要一致存储,占用空间)可以在information_schema 库的innodb_trx这个表中查询长事务的信息

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

mysql InnoDB事务 的相关文章

  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Mysql 时间匹配连接

    我有两个表cpuinfo和jobinfo 我想使用这两种数据创建报告 tabes CREATE TABLE cpuinfo id int 11 NOT NULL AUTO INCREMENT usagetime datetime DEFAU
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • 仅当值发生更改时如何插入数据库?

    我需要更新 替换 MySQL 数据库中的字段 但前提是它们已更改 该表包含 ID 文本字段和更改日期 用户根据更改日期通过 ID 查询数据 即 如果该日期早于用户上次查询数据的时间 则他不想要它 仅当文本字段与具有相同 ID 的现有文本字段
  • Galera 集群问题

    我想在我们的生产环境中使用Galera集群 但我有一些顾虑 每个表必须至少定义一个显式主键 每个表必须运行在InnoDB或XtraDB存储引擎下 分批处理您的大额交易 例如 不要让一个事务插入 100 000 行 而是将其分成更小的块 例如
  • 连接 Netbeans 和 MySQL 但出现大整数错误

    所以我正在尝试向我的 Netbeans 数据库 即 MySQL 添加新连接 但我遇到了大整数转换错误 有人可以帮助我吗 详细地 我右键单击现有的MySQL 服务器位于 localhost 3306 root 已断开连接 gt gt 选择co
  • 如果没有找到值,如何让 MySQL 中的 SUM 函数返回“0”?

    假设我在 MySQL 中有一个简单的函数 SELECT SUM Column 1 FROM Table WHERE Column 2 Test 如果没有条目Column 2 包含文本 Test 然后该函数返回NULL 而我希望它返回 0 我
  • 从另一台计算机访问 MYSQL

    我想开发一个java桌面应用程序 我想在其中设置服务器 这意味着我在这里使用mysql db 该数据库将仅存储在一台电脑上 其余所有用户都可以访问该数据库 所以 我听说了mysql远程连接 其中尝试了一些事情 这些措施如下 我的电脑已连接w
  • covertJSONtoSQL 在 NiFi 中返回空值

    我正在设计一项工作 使用以下命令将数据从 MySQL 中的数据库转移到另一个数据库 MySQL 执行SQL处理器随后将Avro转换为Json then 将Json转换为SQL then PutSQL如下流程图所示 将JSON转换为SQL返回
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例

随机推荐

  • ViewBinding和DataBinding的理解和区别

    之前一直把ViewBinding当成了DataBinding xff0c 直到最近的学习中才发现他们不是一个东西 于是写下这篇笔记帮助理解和区分他们俩 一 ViewBinding 1 什么是ViewBinding 先来看看官方是怎么说的 通
  • Android KeyStore的使用

    在我们App开发过程中 xff0c 可能会涉及到一些敏感和安全数据需要加密的情况 xff0c 比如登录token的存储 我们往往会使用一些加密算法将这些敏感数据加密之后再保存起来 xff0c 需要取出来的时候再进行解密 此时就会有一个问题
  • 2流高手速成记(之四):SpringBoot整合redis及mongodb

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • RabbitMQ延迟消息指南【.NET6+EasyNetQ】

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • sql语法巧用之not取反

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 如何实现一个SQL解析器

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 方便快捷的在 CentOS 7 中安装 Nginx

    介绍 Nginx 是一种流行的高性能 Web 服务器 本教程将教您如何在 CentOS 7 服务器上安装和启动 Nginx 先决条件 本教程中的步骤需要具有特权的root用户 第 1 步 添加 EPEL 软件仓库 要添加 CentOS 7
  • 前端无法渲染CSS文件

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 5大负载均衡算法 (原理图解)

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • JUC中的AQS底层详细超详解

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 进制转换以及位运算

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 京东云开发者|探寻软件架构的本质,到底什么是架构?

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • JS中数值类型的本质

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • pta第二次博客

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • GCC 指令详解及动态库、静态库的使用

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • vulnhub靶场之THALES: 1

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • No 'Access-Control-Allow-Origin' header is present on the requested resource.跨域问题

    请求url xff1a 原因 xff1a spring的全局CORS配置出错 出错代码 xff1a 修改后代码 xff1a
  • Windows下自动云备份思源笔记到Gitee

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • mysql InnoDB事务

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf