深入解析MySQL 事务
目录
- 事务的四大特性 ( ACID )
- 脏读
- 不可重复读
- 幻读
- MySQL的隔离级别
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
事务的四大特性 ( ACID )
原子性(Atomicity):一个事物是一个不可分割的单位,要么全都执行,要么都不执行;
一致性(Consistency):事务执行前后,数据处于合法的状态;
持久性(Isolation):事务执行完后,数据的修改是持久的,不会因为其他操作或故障而对其产生影响;
隔离性(Durability):多个事务并发执行的,事务之间不互相干扰。
假如事物的一个操作整体(动作A,B),动作A,执行完了,动作B,执行到一半,执行过程出错,这时怎么办?有回滚机制,有个日志会记录这些操作,记录数据修改前和数据修改后的值。
脏读
事务A正在修改数据(但是没有提交),事务B就读取了这里的数据,此时事务B读取的操作称为脏读。 解决办法:给写操作加锁,当事务A在写数据的时候,事务B无法读取。
不可重复读
事务A修改数据之后提交了数据“name=L”,然后事务B就读取数据,但是此时A觉得修改的数据不满意“name=H”,继续修改提交了,此时事务B再次读取,发现,啊,怎么数据不一样了。这就是不可重复读的问题。 解决办法:给写操作加锁的同时,给读操作也加锁,当事务A在写的时候,事务B不可以读,事物B在读的时候,事物A也不可以写。
幻读
虽然已经给写操作加锁,和读操作加锁,但是会有种情况,事务B在读的时候,事务A无法修改name,但是事务A可以再写一个age,当事务B再次读取数据的时候发现,咦,怎么多了条数据。 解决办法:只能严格的串行化执行。(并发程度最低,效率也最低,但是数据的可靠性最高)
这里很容易搞混不可重复读和幻读。其实只需要理解,不可重复读是修改数据,数据的条数不变;幻读是增加或者删除数据,数据的内容不变,条数发生改变。
MySQL的隔离级别
读未提交(read-uncommitted):会有脏读,不可重复读,幻读问题 不可重复读(read-committed):会有不可重复读,幻读问题 可重复读(repeatable-read):会有幻读问题 串行化 (serializable):解决这三个问题
事务的隔离级别并不是越高越好,但事务的隔离级别越高,那么并发性就越低,效率越低,数据的可靠性就会越高。
MySQL8开始,用SELECT@@GLOBAL.transaction_isolation,@@transaction_isolation;
查询隔离级别(这里是是MySQL5)
这里我们可以看到MySQL的全局隔离级别和当前会话隔离级别皆是REPEATABLE一READ(可重复读),不同的数据库有不同的默认隔离级别,而且我们也可以自行修改它。
通过如下命令可以修改隔离级别(建议在修改时修改当前 session 隔离级别即可,不用修改全局的隔离级别):
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
注意,如果只是修改了当前 session 的隔离级别,则换一个 session 之后,隔离级别又会恢复到默认的隔离级别,所以我们测试时,修改当前 session 的隔离级别即可。
到此这篇关于深入解析MySQL 事务的文章就介绍到这了,更多相关MySQL 事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
mysql事务和隔离级别底层原理浅析
目录 前言 一.事务底层原理浅析 原子性: 持久性 隔离性: 一致性: 二.隔离级别底层原理浅析 三.总结 前言 首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再分割的操作集合(工作逻辑单元). 事务的特性: 原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.一致性(Consistency):事务执行的结果必须是使数据库从一个一致性
-
mysql事务详细介绍
目录 简介 事务四个特性 事务隔离级别 验证 MVCC 当前读 快照读 当前读.快照读.MVCC关系 mvcc 解决的问题 MVCC实现原理 可见性规则 简介 事务是由一组sql语句组成的逻辑处理单元 事务四个特性 原子性(Atomicity): 要么都成功要么都失败 undo log实现 一致性(Consistent): 如转账前后两个数额总合保持不变 隔离性(lsolation):数据库提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境下运行 锁,mvcc多版本并发控
-
mysql 事务解析
事务(transaction) 事务是业务逻辑的一个基本的单元组成. 每一个事务由一条条sql语句组成. 和事务相关的语句(insert,delete,update)这些DML语句 事务的存在保证了数据的安全性. 事务机制: 每一次执行DML语句都会记录操作,但不会修改数据,等到所有DML执行, 最后提交事务(删除记录,修改硬盘数据)或者回滚事务(删除记录,不修改数据). 事务由四大特性:ACID A:原子性,事务是最小的工作单元 C:一致性,事务中的DML语句要么都执行成功,要么都失败 I:隔
-
MySQL事务的隔离性是如何实现的
目录 并发场景 写-写 读-读 读-写 和 写-读 MySQL中的锁 行级锁 表级锁 隔离级别 Read Committed Repeatable Read 参考博客 并发场景 最近做了一些分布式事务的项目,对事务的隔离性有了更深的认识,后续写文章聊分布式事务.今天就复盘一下单机事务的隔离性是如何实现的? 隔离的本质就是控制并发,如果SQL语句就是串行执行的.那么数据库的四大特性中就不会有隔离性这个概念了,也就不会有脏读,不可重复读,幻读等各种问题了 对数据库的各种并发操作,只有如下四种,写写,
-
MySQL数据库的事务和索引详解
目录 一.事务: 事务四大特性: 并发事务带来哪些问题?(隔离所导致的一些问题) 事务隔离级别有哪些? MySQL的默认隔离级别: 二.索引: 索引的作用: 索引的分类: 索引准则: 索引的数据结构: 总结 一.事务: 事务是逻辑上的一组操作,要么都成功,要么都失败! ---------------------------------- 1.SQL执行 A:1000元 -->转账200元 B:200元 2.SQL执行 A:800元 -
-
MySQL 数据库 索引和事务
目录 1. 索引 1.1 概念 1.2 作用 1.3 索引的原理 1.3.1 减少磁盘的访问次数是构建索引的核心思想 1.3.2 B+ 树适用实现索引的底层 1.4 适用场景 1.5 使用语句 1.5.1 查看索引 1.5.2 创建索引 1.5.3 删除索引 2. 事务 2.1 概念 2.2 为什么使用事务 2.3 四大属性 2.3.1 原子性 2.3.2 一致性 2.3.3 持久性 2.3.4 隔离性 2.4 使用方法 1. 索引 1.1 概念 索引是为了加速对表中数据行的检索而创建的一种分散
-
深入解析MySQL 事务
目录 事务的四大特性 ( ACID ) 脏读 不可重复读 幻读 MySQL的隔离级别 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败. 事务的四大特性 ( ACID ) 原子性(Atomicity):一个事物是一个不可分割的单位,要么全都执行,要么都不执行: 一致性(Consistency):事务执行前后,数据处于合法的状态: 持久性(Isolation):事务执行完后,数据的修改是持久的,不会因为其他操作或故障而对其产生影响: 隔离性(Durability):多个事
-
深入解析MySQL 事务
目录 事务的四大特性 ( ACID ) 脏读 不可重复读 幻读 MySQL的隔离级别 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败. 事务的四大特性 ( ACID ) 原子性(Atomicity):一个事物是一个不可分割的单位,要么全都执行,要么都不执行: 一致性(Consistency):事务执行前后,数据处于合法的状态: 持久性(Isolation):事务执行完后,数据的修改是持久的,不会因为其他操作或故障而对其产生影响: 隔离性(Durability):多个事
-
深入解析MySQL的事务隔离及其对性能产生的影响
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read). Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离
-
全面解析MySQL中的隔离级别
数据库并发的对同一批数据进行增删改,就可能会出现我们所说的脏写.脏读.不可重复读.幻读等一系列问题.MySQL提供了一系列机制来解决事务并发问题,比如事务隔离.锁机制.MVCC多版本并发控制机制.今天来探究一下事务隔离机制. 事务是一组SQL组成的逻辑处理单元,先来看下事务的ACID特性: 原子性(Atomicity) :事务是一个原子操作单元,对数据进行修改,要么全执行要么全不执行.是从执行层面上来描述的. 一致性(Consistent) :在事务开始和完成时,数据都必须保持一致状态.是从执行
-
解析MySQL binlog
一.binlog简介 binlog即binary log,二进制日志文件.它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select.show等),以事件形式记录并保存在二进制文件中. binlog主要有两个应用场景,一是用于复制,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的.二是用于数据恢复,例如还原备份后,可以重新执行备份后新产生的binlog,使得数据库保持最新状态.除去这两个主要用途外,binlog可以用于异构系统之间数据的交互
-
MySQL事务日志(redo log和undo log)的详细分析
目录 前言 1.redo log 1.1 redo log和二进制日志的区别 1.2 redo log的基本概念 1.3 日志块(log block) 1.4 log group和redo log file 1.5 redo log的格式 1.6 日志刷盘的规则 1.7 数据页刷盘的规则及checkpoint 1.8 LSN超详细分析 1.9 innodb的恢复行为 1.10 和redo log有关的几个变量 2.undo log 2.1 基本概念 2.2 undo log的存储方式 2.3 和
-
一文解析MySQL的MVCC实现原理
目录 1. 什么是MVCC 2. 事务的隔离级别 3. Undo Log(回滚日志) 4. MVCC的实现原理 4.1 当前读和快照读 4.2 隐藏字段 4.3 版本链 4.4 Read View(读视图) 5. 不同隔离级别下可见性分析 5.1 READ COMMITTED(读已提交) 5.2 REPEATABLE READ(可重复读) 1. 什么是MVCC MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数
-
解析MySQL中存储时间日期类型的选择问题
一般应用中,我们用timestamp,datetime,int类型来存储时间格式: int(对应javaBean中的Integer或int) 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mysql提供的时间函数 结论:适合需要进行大量时间范围查询的数据表 datetime(javaBean中用Date类型) 1. 占用8个字节 2. 允许为空值,可以自定义值,系统不会自动修改其值. 3. 实际格式储存(Just stores w
-
深度解析MySQL启动时报“The server quit without updating PID file”错误的原因
很多童鞋在启动mysql的时候,碰到过这个错误, 首先,澄清一点,出现这个错误的前提是:通过服务脚本来启动mysql.通过mysqld_safe或mysqld启动mysql实例并不会报这个错误. 那么,出现这个错误的原因具体是什么呢? 哈哈,对分析过程不care的童鞋可直接跳到文末的总结部分~ 总结 下面,来分析下mysql的服务启动脚本 脚本完整内容如下: #!/bin/sh # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Progr
随机推荐
- 二进制交叉权限微型php类分享
- ASP.NET文本框密码赋默认值的方法
- 让新消息在网页标题闪烁提示的jQuery代码
- autorun.inf+无法显示隐藏文件+病毒的清除方法
- java自定义注解接口实现方案
- Oracle出现ora-12154无法解析指定连接标识符的解决方法
- 使用Python的Bottle框架写一个简单的服务接口的示例
- 如何确保JavaScript的执行顺序 之jQuery.html深度分析
- php 运算符与表达式详细介绍
- asp实现一个统计当前在线用户的解决方案
- C#实现在两个数字之间生成随机数的方法
- Android自定义View实现验证码
- 用js实现控制内容的向上向下滚动效果
- PHP 返回数组后处理方法(开户成功后弹窗提示)
- 比较详细的分析下载站的发展注意事项
- 浅谈docker学习之docker数据卷(volume)
- Spring Cloud学习教程之DiscoveryClient的深入探究
- Vue3.0结合bootstrap创建多页面应用
- JS数组扁平化(flat)方法总结详解
- python爬取百度贴吧前1000页内容(requests库面向对象思想实现)