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

MySQL 事务

MySQL提供了许多支持事务的存储引擎,但 InnoDB 现在已经成为推荐使用的存储引擎。而且从 MySQL5.5 版本开始,默认的存储引擎就从 MyISAM 变成了 InnoDB。所以接下来描述的事务都将基于InnoDB存储引擎。

事务的定义

事务是一组SQL语句作为一个工作单元以原子方式进行处理。

ACID特性

事务具有四个特性,分别是原子性、一致性、隔离性、持久性,这四个特性简称ACID特性。

原子性(Atomicity)

一个事务是一个不可分割的工作单元,事务中的所有操作要么全部成功提交,要么全部失败回滚。
事务的原子性是通过undo log来实现的。当事务对数据进行修改时,InnoDB会生成对应的undo log,当事务需要进行回滚时,InnoDB就会根据undo log恢复到事务开始执行之前的状态。

持久性(Durability)

事务一旦提交,事务所做的修改会永久保存在数据库中,此时即使数据库崩溃数据也不会丢失。实际上持久性也分很多不同的级别,有些持久性策略能够提供非常强的安全保障,而有些则未必。
事务的持久性是通过redo log来实现的。当事务提交时,InnoDB会把 redo log 写到磁盘中,如果数据库宕机,恢复后会读取 redo log 中的记录来恢复数据。

隔离性(Isolation)

一个事务的操作不会被其它事务影响。最理想的情况是是一个事务执行完成后再执行另一个事务,但处于性能上的考虑,一般都需要多个事务并发执行,这时就要求事务执行过程中不受到其他并发执行事务的影响。比如不能读取到另一个未提交事务所做的修改。
事务的隔离性是通过MVCC和锁机制来实现,将在之后的文章进行详细介绍。

一致性(Consistency)

事务执行前后,在业务上来看数据都是正确的。比如学生的学号不会有重复,所有账户的总额是不变的。
一致性是事务追求的最终目标,原子性、持久性和隔离性,都是为了保证数据库状态的一致性而存在的。此外,除了数据库层面的保障,一致性的实现也需要应用层面进行保障。

事务并发问题

在并发情况下,MySQL同时读写可能会导致三类问题:脏读、不可重复度和幻读。

脏读

一个事务读取到了另一个事务未提交的数据。

不可重复读

一个事务中两次查询同一条数据,但看到的数据结果不一样。

幻读

一个事务中两次查询某个范围的数据,但查询结果的条数不一样。

事务隔离级别

事务隔离级别越高,并发程度就会越低。

READ UNCOMMITTED(读未提交)

在READ UNCOMMITED级别,存在脏读、不可重复读、幻读问题。从性能上来说不会比其他级别好太多,却缺乏其他级别的很多好处,在实际应用中一般很少使用。此级别不能满足前面提到的隔离性的定义。

READ COMMITTED(读已提交)

在READ COMMITED级别,存在不可重复读、幻读问题。大多数数据库系统的默认隔离级别是READ COMMITED(但MySQL不是)。
REPEATABLE READ(可重复读)
在READ COMMITED级别,存在幻读问题。REPEATABLE READ是MySQL默认的事务隔离级别。

SERIALIZABLE(串行化)

SERIALIZABLE是最高的隔离级别,该级别强制事务按序执行,使不同事务之间不可能产生冲突。实际应用中很少用到这个隔离级别,除非需要严格确保数据安全且可以接受并发性能下降的结果。

隔离级别脏读不可重复读幻读
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)×
REPEATABLE READ(可重复读)××
SERIALIZABLE(串行化)×××

AUTOCOMMIT

默认情况下,MySQL处于自动提交(AUTOCOMMIT)模式。单个DML语句会被隐式包装在一个事务中并在执行成功后立即提交。也可以使用关键字BRGIN或者START TRANSACTION来开始一个多语句的事务。
在当前连接中,可以使用SET命令设置AUTOCOMMIT来启动或禁用自动提交模式。如果设置了AUTOCOMMIT=0,则当前连接总是会处于某个事务中,直到发出COMMIT或者ROLLBACK。
还有一些命令,当在活动的事务中发出时,会导致MySQL在事务的所有语句执行完毕前提交当前事务。这些通常是DDL命令,如ALTER TABLE,但LOCK TABLES和其他一些语句也具有同样的效果。

参考

《高性能MySQL(第4版)》

相关文章:

  • 后续遍历非递归算法
  • MFC列表控件的用法(基于对话框的编程)
  • NFS协议详解
  • Compiere的应用字典介绍
  • Qt第二十八章:异步
  • 用 NEON 实现高效的 FIR 滤波器
  • Java多线程同步工具类:Semaphore、CountDownLatch 、CyclicBarrier、Exchanger原理剖析
  • opencv入门笔记(二)
  • JSP以及相关使用
  • 最新版本zookeeper+dubbo-admin
  • CN_计算机网络性能指标@信道利用率@信道吞吐率
  • 实战讲解Kibana开发工具(Dev tools)操作ES:CURD(图+文)
  • 【Markdown】编辑器使用技巧大汇总6。行列式的输入,矩阵的输入(一般化的矩阵,增广矩阵,括号形式的矩阵,有元素省略的矩阵)
  • 线程安全问题
  • 计算机导论第十一周课后作业
  • ROS1 LTS版本安装教程
  • 1. STL六大组件
  • 微机原理与接口技术:DMA传输 详细笔记
  • 【AI】Python 实现八数码问题
  • [附源码]计算机毕业设计基于springboot的高校车辆租赁管理系统
  • Qt跨平台截图工具
  • React 的调度系统 Scheduler
  • .NET 桌面软件内存泄露分析
  • 【校招VIP】【约起来】java引言:java校招对项目的要求
  • 20221207英语学习
  • 数据聚合——DSLRestAPI
  • IBM SPSS Modeler分类决策树C5.0模型分析空气污染物数据
  • 软件测试工程师,如何工资过万?(经验之谈)
  • TextMeshPro源码移植-替换掉PackageManager
  • 【校招VIP】[推电影项目]产品的规划和商业化分析
  • 2022内蒙古高考音乐类一分一段表 成绩排名查询
  • 2021年江苏师范大学学费 各专业学费是多少
  • 2022年内蒙古高考512分能报什么大学 512分能上哪些院校
  • 金融管理与服务学什么
  • 2022药物分析专业就业方向及前景
  • 绵阳美术培训学校排名前十 好画室有哪些
  • 2022年上海高考512分能报什么大学 512分能上哪些院校
  • 学校断档对考生有无影响
  • 电子商务就业方向岗位 就业方向有什么
  • 18岁读大专还是打工好