gball个人知识库
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)

ggball

后端界的小学生
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)
  • 面试

  • 数据库

    • mysql

      • mysql思维导图
      • 7全文索引
      • mysql导入导出
      • mysql服务
      • mysql基本语句
      • mysql之sql_mode
      • sql函数
      • 每年,每季,每月,每周的最后一天
      • 数据库小笔记
      • 重新认识mysql
      • mysql系统配置与启动选项
      • 字符集和比较规则
      • InnoDB记录结构
      • InnoDB数据页结构
      • B+树索引的由来
      • mysql之InnoDB数据目录结构
      • explain之访问方法
      • EXPLAIN 语句输出的各个列解释
      • mysql之InnoDB的BufferPool
      • mysql之事务
        • 事务
        • 事务的状态
        • 事务的语法
        • 保存点
      • redo日志(上)
      • redo日志(下)
      • MVCC并发管理控制
      • undo log了解
    • pg

    • redis

  • linux

  • node

  • tensorFlow

  • 基础组件

  • 基础知识

  • 算法与设计模式

  • 分布式

  • 疑难杂症

  • go学习之旅

  • 极客时间

  • 知识库
  • 数据库
  • mysql
ggball
2022-02-25

mysql之事务

# 事务

需要保证 原子性 、 隔离性 、 一致性 和 持久性 的一个或多个数据库操作称之为一个 事务

原子性(Atomicity)

一致性(Consistency)

​ 保证一致性的努力:

  • 数据库本身能为我们保证一部分一致性需求。
  • 更多的一致性需求需要靠写业务代码的程序员自己保证。

隔离性(Isolation)

持久性(Durability) 数据从内存刷到磁盘

持久性是通过 redo log (重做日志)来保证的; 原子性是通过 undo log(回滚日志) 来保证的; 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的; 一致性则是通过持久性+原子性+隔离性来保证;

原子性和一致性一样吗?如何看待?

原子性,要么一起执行,要么一起回滚,更看重过程。一致性,数据前后状态是一致的,更看重数据库的状态,就像能量守恒定律

# 事务的状态

  • 活动的(active)

事务对应的数据库操作正在执行过程中时,我们就说该事务处在 活动的 状态。

  • 部分提交的(partially committed)

当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在 部分提交的 状态。

  • 失败的(failed)

当事务处在 活动的 或者 部分提交的 状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续

执行,或者人为的停止当前事务的执行,我们就说该事务处在 失败的 状态。

  • 中止的(aborted)

如果事务执行了半截而变为 失败的 状态,比如我们前边唠叨的狗哥向猫爷转账的事务,当狗哥账户的钱被扣除,但是猫爷账户的钱

没有增加时遇到了错误,从而当前事务处在了 失败的 状态,那么就需要把已经修改的狗哥账户余额调整为未转账之前的金额,换句

话说,就是要撤销失败事务对当前数据库造成的影响。书面一点的话,我们把这个撤销的过程称之为 回滚 。当 回滚 操作执行完毕

时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了 中止的 状态。

  • 提交的(committed)

当一个处在 部分提交的 状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了 提交的 状态。

image-20220224161519676

只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了

# 事务的语法

开启事务

begin;
或者
start transaction;
1
2
3

提交事务

coomit;
1

手动终止事务

rollback;
-- ROLLBACK 语句是我们程序员手动的去回滚事务时才去使用的,如果事务在执行过程中遇到了某些错误而无法继续执行的话,事务自身会自动的回滚。
1
2

支持事务的存储引擎

innoDB和NDB存储引擎。

自动提交

MySQL 中有一个系统变量 autocommit;

查询

SHOW VARIABLES LIKE 'autocommit';
1

开启

SET autocommit = ON;
1

关闭

SET autocommit = OFF;
1

隐式提交

就算沒有显性执行commit,有一些操作也会悄悄地把提交给执行了。比如,执行DDL语言,重复执行开启事务的语句等等。

# 保存点

开启事务后,标记了保存点,如果发生回滚操作,不会一下回到事务开始之前的样子,而是可以指定回滚到某个保存点。

定义保存点的语法如下:

SAVEPOINT 保存点名称;
1

当我们想回滚到某个保存点时,可以使用下边这个语句(下边语句中的单词 WORK 和 SAVEPOINT 是可有可无的):

ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;
1

不过如果 ROLLBACK 语句后边不跟随保存点名称的话,会直接回滚到事务执行之前的状态。

刪除保存点

RELEASE SAVEPOINT 保存点名称;
1
上次更新: 2025/06/04, 15:06:15
mysql之InnoDB的BufferPool
redo日志(上)

← mysql之InnoDB的BufferPool redo日志(上)→

最近更新
01
AIIDE
03-07
02
githubActionCICD实战
03-07
03
windows安装Deep-Live-Cam教程
08-11
更多文章>
Theme by Vdoing
总访问量 次 | 总访客数 人
| Copyright © 2021-2025 ggball | 赣ICP备2021008769号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×

评论

  • 评论 ssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
×