MySQL的事务

一、事务的概念

在MySQL中,只有InnoDB存储引擎才支持事务。

事务的处理用来维护数据库数据的完整性,保证同一个事务里的一批SQL语句,要么全部执行,要么全部不执行。

事务用来管理DDL、DML、DCL操作,比如insert、update、delete语句,默认自动提交,即执行SQL语句后会马上执行commit操作。

显示地开启一个事务必须使用命令begin或者start transaction,或者执行命令set autocommit=0,用来禁止使用当前会话的自动提交。

  • BEGIN或START TRANSACTION:显示地开启一个事务。
  • COMMIT:提交事务,并使已数据库进行的所有修改是永久的。
  • ROLLBACK:回滚,结束用户的事务,并撤销正在进行的所有未提交的修改。

二、事务的并发问题

在事务的并发操作中可能会出现如下的问题:

  • 丢失更新:一个事务更新之后,另外一个事务也对这个数据进行了更新,那么第一个事务的更新就丢失了。
  • 脏读:一个事务读取到了另外一个事务未提交的数据
  • 不可重复读:一个事务因读取到另外一个事务已经提交的数据。导致对同一条记录的读取两次以上的结果不一致。update操作。
  • 幻读:一个事务因读取到另外一个事务已提交的数据,导致对同一张表的读取结果不一致,insert、delete所致。

三、事务的隔离级别

3.1 事务的隔离级别

为了避免以上几种情况的出现,在标准的SQL规范中,定义了4个事务隔离级别,不同隔离级别对事务的处理不同:

四种隔离级别由低到高分别为:

  • Read uncommitted(读未提交):最低隔离界别,任何情况都无法保障
  • Read committed(读已提交):可避免脏读发生
  • Repeated read(可重复读):可避免脏读和不可重复读的发生。Innodb的RR还可以解决幻读,主要原因是GAP锁(间隙锁),只有RR才能使用GAP锁。
  • serializable(串行化):可避免所有情况(MVCC降低为Locaking-Base CC)

3.2 默认隔离级别

大多数数据库的默认隔离级别是Read committed,比如Oracle和DB2等。MySQL数据库的默认隔离级别是Repeatable Read。

在MySQL数据库中查看当前事务的隔离级别:

select @@tx_isolation;

在MySQL中设置事务的隔离级别:

set [glogal|session]transaction isolation level 隔离级别名称;
或者
set tx_isolation='隔离级别名称';

隔离级别越高,越能保障数据的一致性和完整性,但是对并发性能的影响也越大。

对于多数的应用程序,可以把默认隔离级别设置为Read Committed,为避免脏读读取,同时还具有良好的并发性能。在可能出现不可重复读、幻读这些问题的场合,可以由应用程序采用悲观

锁或者乐观锁来控制。

3.3 Mysql的事务流程

以update为例,innodb的事务流程如下:

update upms_user set real_name='测试'where user_name='A001';

1)事务开始

2)对user_name='A001'这条数据上排他锁,并对数据两边临近范围加gap锁,防止别的事务insert新数据,保证隔离性。

3)将需要修改的数据页加载到innodb_buffer_cache中(内存中的一块区域)。

4)记录检索数据到undo log(修改前的数据,用来保证数据的原子性和一致性)。

5)修改user_name='A001'的数据real_name='测试'。记录修改数据信息到redo log(注意,是数据的当前页修改操作信息,而不是修改后的数据,用来保证持久性),redo log处于prepare状态,随时可以提交事务。

6)刷新innodb_buffer_cache中脏数据到底层磁盘,非commit触发,数据库自动操作。

7)记录binlog,写入磁盘。

8)提交事务,把刚才的redo log改提交状态(两阶段提交)

9)事务结束

四、事务日志文件

4.1 undo log

undo用来保存数据更改之前的数据;保证原子性、一致性。InnoDB存储引擎中,还用Undo log来实现多版本并发控制(MVCC)。

undo log的目的就是满足事务的原子性。操作任何数据之前,首先将数据备份到undo log,然后进行数据的修改。

undo log是为了解决回滚问题,如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用undo log中的备份将数据恢复到事务开始之前的状态。

4.2 redo log

数据库先写redo logo,然后才修改buffer cache中的页(修改数据),修改是以页为单位的,所以先写redo才能保证一个大事务commit的时候,redo已经刷新的差不多了。反过来说假如是先改buffer cache中的页,然后再写redo,就可能会由很多redo需要写,因为一个页中可能有很多数据行,而很多数据行产生的redo也可能比较多,那么commit的时候,就可能会有很多redo需要写。

在事务提交前,只需要将redo log持久化即可。不需要将数据持久化,当系统崩溃时,虽然数据没有持久化,但是Redo log已经持久化。系统可以根据redo log的内容,将所有的数据恢复到最新的状态。需要注意的是,事务过程中,先把redo写进redo log buffer中,然后MySQL后台进程page cleaner thread适当的去刷新redo到底层磁盘永久保存。

MySQL的事务(看看也许有帮助呢)的更多相关文章

  1. MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...

  2. Mysql分布式事务

    关于Mysql分布式事务介绍,可参考:http://blog.csdn.net/luckyjiuyi/article/details/46955337 分为两个阶段:准备和执行阶段.有两个角色:事务的 ...

  3. mysql的事务和select...for update

    一.mysql的事务mysql的事务有两种方式:1.SET AUTOCOMMIT=0;也就是关闭了自动提交,那么任何commit或rollback语句都可以触发事务提交;如果SET AUTOCOMMI ...

  4. MySQL的事务

    MySQL的事务 1.事务:事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行,要么全部放弃执行. 2.事务具备的四个特性(简称为ACID性): (1)原子性(Atomic ...

  5. mysql 分布式事务

    php + mysql 分布式事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicit ...

  6. MySQL之事务隔离级别--转载

    转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...

  7. MySQL数据库事务剖析

    MySQL数据库事务剖析 事务就是一组原子性的SQL查询,是一个独立的执行单元.事务内的语句,要么全部执行成功,要么全部执行失败. 1.事务的标准特征 一个运行良好的事务处理系统,必须具备原子性.一致 ...

  8. mysql数据库事务详细剖析

    在写之前交代一下背景吧! 做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql.oracle.我这块就主要解释一下mysql数 ...

  9. Mysql数据库事务隔离级别

    事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列.事务ACID属性,即原子性(Atomicity).一致性(Consistency ...

  10. 后端分布式系列:分布式存储-MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适.最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类.结合实际工作中碰到的问题,以寻找答案的方式来剖 ...

随机推荐

  1. 基本环境安装 jdk,mq,redis,nginx

    JDK:解压安装包,命令为 tar -zxvf jdk-8u381-linux-x64.tar.gz配置环境变量,使用 vim 命令(需要安装vim,安装命令为:yum install vim)修改 ...

  2. 洛谷题解 | P5660 数字游戏

    ​ 目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题目简化 题目思路 AC代码 题目描述 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏,小 P 同学想要 ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (103)-- 算法导论10.1 1题

    一.用go语言,仿照图 10-1,画图表示依次执行操作 PUSH(S,4).PUSH(S,1).PUSH(S,3).POP(S).PUSH(S,8)和 POP(S)每一步的结果,栈 S初始为空,存储于 ...

  4. Python面向对象——反射(hasattr、getattr、setattr、delattr)、内置方法(__str__和__del__)、元类(介绍,创建类的流程,exec,自定义元类)、属性查找

    文章目录 反射 内置方法 __str__方法 __del__函数 元类 元类介绍 class关键字创建类的流程分析 补充:exec的用法 自定义元类控制类StanfordTeacher的创建 自定义元 ...

  5. IEEE 国际计算科学与工程会议 (CSE-2023)

    随着计算机系统变得越来越庞大和复杂,基于数据的计算技术在支持下一代科学和工程应用方面发挥着关键作用.如今,科学和工程中基于云的复杂大数据应用由异构软件/硬件/网络组件组成,这些组件的容量.可用性和环境 ...

  6. 从零用VitePress搭建博客教程(3) - VitePress页脚、标题logo、最后更新时间等相关细节配置

    接上一节:从零用VitePress搭建博客教程(2) –VitePress默认首页和头部导航.左侧导航配置 五.默认主题相关细节配置 关于默认主题的标题,logo.页脚,最后更新时间等相关细节配置,我 ...

  7. 在不知带头节点地址的情况下删除和插入一个p指针指向的节点总结

    在不知带头节点地址的情况下删除和插入一个p指针指向的节点总结 (p指向的不是第一个,也不是最后一个)A->B->C *p->B 插入(在p结点之前插入q) 解析: 直接往p前插入q, ...

  8. CF1789D Serval and Shift-Shift-Shift 题解

    题目链接 题目分析 首先,看到题目中的左移右移之后再异或,我们自然可以想到在移动的过程中字符串的一段前缀和后缀不会改变,考虑通过这个性质逐位还原. 因为异或 0 不会改变原本的值,所以我们可以找到整个 ...

  9. QT编程过程中遇到的问题

    QT编程过程中遇到的问题 (一)QT卡死 (二)mingw转msvc编码问题 (三)内存泄漏问题 1. vld检查内存泄漏问题 2. QTextEdit造成内存泄漏 (end)后面会更新 (一)QT卡 ...

  10. 批处理(Batch或离线计算)和流计算(Streaming或实时计算)

    大数据处理流程 课程:https://developer.aliyun.com/learning/course/432/detail/5385 流程 发 批处理(Batch或离线计算) 基础:goog ...