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. Vue路由新开页面跳转和传参传递

    需求:在后台管理系统首页列表项中,点击详情跳转到系统中指定菜单的路由要求新开窗口并需要带上参数查询. 第一种方法: 1 const { id } = item; 2 let routeUrl = th ...

  2. RatingBar android 自定义 评级 星星

    资源下载地址 <!-- xml 中的使用 --> <RatingBar android:id="@+id/ratingBar" android:layout_wi ...

  3. 数据重整:用Java实现精准Excel数据排序的实用策略

    摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在数据处理或者数据分析的场景中,需要对已有的数据进行排序,在Ex ...

  4. 【Postman】以命令行形式执行Postman脚本(使用newman)

    以命令行形式执行Postman脚本(使用Newman) 目录 以命令行形式执行Postman脚本(使用Newman) 一.背景 二.Newman的安装 1.Node.js 2.Newman 三.脚本准 ...

  5. MyBatis foreach循环批量修改数据时报错

    报错如下 org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: java.sql.S ...

  6. 深入理解Python虚拟机:super超级魔法的背后原理

    深入理解Python虚拟机:super超级魔法的背后原理 在本篇文章中,我们将深入探讨Python中的super类的使用和内部工作原理.super类作为Python虚拟机中强大的功能之一,super ...

  7. Oracle 高可用 阅读笔记

    1   个人理解概述 1.1  Oracle dg Oracle Data Guard通过从主数据库传输redo data,然后将apply redo到备用数据库,自动维护每个备用数据库.DG分为3个 ...

  8. CSS 还原拉斯维加斯球数字动画

    我的小册 <CSS 技术揭秘与实战通关>上线了,想了解更多有趣.进阶.系统化的 CSS 内容,可以猛击 - LINK. 最近大家刷抖音,是否有刷到拉斯维加斯的新地标 「Sphere」: 场 ...

  9. PTA乙级1039(C++)散列表解法

    题目 1039 到底买不买  小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖. 于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如 ...

  10. P7072 [CSP-J2020] 直播获奖

    Problem 考查知识点:桶优化. 题目简述 竞赛的获奖率为 \(w\%\),即当前排名前 \(w\%\) 的选手的最低成绩就是即时的分数线. 若当前已评出了 \(p\) 个选手的成绩,则当前计划获 ...