隔离级别

Mysql事务隔离实现机制

我怕爱的太早我们不能终老 提交于 2020-02-25 19:14:13
今天我们来看看事务隔离的实现原理 事务隔离 隔离性与隔离级别 当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读 (non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有 了“隔离级别”的概念 在谈隔离级别之前,你首先要知道,你隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间寻找一个平衡点 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当 出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行 在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。 在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。 在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。这里需要注意的是, “读未提交”隔离级别下直接返回记录上的最新值,没有视图概念; 而“串行化”隔离级别下直接用加锁的方式来避免并行访问 事务隔离的实现

MySQL重要知识点(总结)

拥有回忆 提交于 2020-02-24 20:29:00
最近一段时间都学习mysql,将重要的知识点总结如下: 一、字段、表、索引设计规范相关 二、事务相关 三、锁相关 四、存储引擎相关 五、大表优化相关 六、索引优化相关 七、语句优化相关 一、字段、表、索引设计规范 1、字段设计规范 ① 字段类型优先选择符合存储需要的最小类型 字段类型优先级:整型>date;time >enum>char;varchar>blob 原因:整型,time运算快,节省内存;enum列内部是用整型存储的,char,varchar要考虑字符集的转换和排序的校对集,速度慢;blob无法使用临时表。 ② 够用就行(如smallint,varchar(N)) 原因:大的字段浪费内存,影响速度,如varchar(10),varchar(300),虽然存储的内容一样,但是,在表联查时,varchar(300)要花更多内存 ③ 尽量避免使用允许为null() 原因:null不利于索引,要用特殊的字节标注,在磁盘上占的空间其实更大 例子:建两个相同字段的表,一个允许为null,一个不允许。可以发现为null的索引更大些。 ④ 避免使用ENUM类型 修改ENUM值需要使用ALTER语句 ENUM类型的ORDER BY操作效率低,需要额外操作 禁止使用数值作为ENUM的枚举值 ⑤ 使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间 TIMESTAMP

Mysql死锁原理分析

纵然是瞬间 提交于 2020-02-23 19:29:24
文章来自何凳成博客 1 背景 MySQL/InnoDB 的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事 咨询这方面的问题。同时,微博上也经常会收到MySQL 锁相关的私信,让我帮助解决一些 死锁的问题。本文,准备就MySQL/InnoDB 的加锁问题,展开较为深入的分析与讨论,主要 是介绍一种思路,运用此思路,拿到任何一条SQL 语句,就能完整的分析出这条语句会加 什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。 注 :MySQL 是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于InnoDB 存储引擎,其他引擎的表现,会有较大的区别。 1.1 MVCC:Snapshot Read vs Current Read MySQL InnoDB 存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based ConcurrencyControl)。MVCC 最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多些少的OLTP 应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能,这也是为什么现阶段,几乎所有的 RDBMS,都支持了 MVCC。 在 MVCC 并发控制中

mysql的事务隔离级别

痞子三分冷 提交于 2020-02-23 13:53:01
什么是事务   事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。   事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。 事务的 ACID   事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。   1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做   2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。   3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。   4 、持续性。也称永久性,指一个事务一旦提交

MySQL锁与事务隔离级别

主宰稳场 提交于 2020-02-16 22:39:21
1、概述 (1) 锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 (2) 锁的分类 从性能上分为 乐观锁 和 悲观锁 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。 例子:① 在数据库的表中加一个version字段,用来记录每次修改数据的版本号,防止并发修改数据出错;② CAS原子类。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。 例子:synchronized关键字。 从对数据库操作的类型分为 读锁 和 写锁 (都属于悲观锁) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。 写锁(排它锁):当前写操作没有完成前,它会阻断其他session的写锁和读锁。(session:数据库连接) 从对数据操作的粒度分为 表锁 和 行锁 。 2、表锁与行锁 (1) 表锁( 偏读 ) 表锁偏向MyISAM存储引擎 ,开销小,加锁快,无死锁

【事务, 锁】

一世执手 提交于 2020-02-16 17:11:34
事务特性 ACID A:atom原子性 C:consistency 一致性 I:isolation 隔离性 D:durability 持久性 隐式提交 保存点 隔离性有四个级别 右边的第一次读和第二次读的不一样。这就是不可重复读。 右边第一次查到12条记录,第二次查到13条记录。这叫幻读。 以上隔离性四个级别都是sql标准。 mysql在实现sql标准时,再可重复读级别已经解决幻读的情况。 来源: CSDN 作者: 嘤嘤怪QQQ 链接: https://blog.csdn.net/zj20165149/article/details/104342363

隔离级别的实现原理

孤者浪人 提交于 2020-02-14 18:37:06
隔离级别的实现原理 https://www.cnblogs.com/wade-luffy/p/8686883.html#_label7 目录 排他锁(Exclusive Lock) 共享锁(Share lock) “丢失修改”的问题 读未提交(最低的事务隔离级别)-脏数据 读已提交-不可重复读 可重复读-幻读 Serializable (串行化) MVCC(多版本并发控制) 原理 流程变化 回到顶部 排他锁(Exclusive Lock) 排他锁(Exclusive Lock) , 简称 X锁。 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。 规则1 :写 一个数据之前加X锁, 事务提交之后释放该X锁。 回到顶部 共享锁(Share lock) 共享锁(Share lock) ,简称S锁, 这个锁和之前的排他锁X锁有区别, 主要用于读取数据。 如果一个数据加了X锁, 就没法加S锁,没法再加X锁。 如果一个数据加了S锁, 就可以加S锁,没法再加X锁。 规则1 : 读一个数据之前加S锁, 读完之后立刻释放该S锁。 规则2 : 读一个数据之前加S锁, 事务提交之后立刻释放该S锁。 回到顶部 “ 丢失修改 ”的问题 事务1的修改被事务2的修改覆盖了

022、事物的隔离

有些话、适合烂在心里 提交于 2020-02-12 19:32:25
事务的隔离级别(了解) * 概念: 多个事物之间是隔离的,相互独立的。但是如果过个事物操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。 * 存在的问题: 1、脏读:一个事物,读取到另一个事务中没有提交的数据。 2、不可重复读(虚读):在同一个事务,两次读到的数据不一样。 3、幻读:一个事务操作(DML)数据表中所有记录,另一个事物添加了一条数据,则第一个事物查询不到自己的修改。 * 隔离级别: 1. READ UNCOMMITTED:读未提交 * 设置该级别会产生问题:脏读、不可重复读、幻读。 2. READ COMMITTED:读已提交(oracle默认是这个级别) * 设置这个级别会产生问题:不可重复度、幻读 3、REPEATABLE READ:可重复读(mySQL默认设置为该级别) * 设置该级别会产生问题:幻读 4、SERIALIZABLE:串行化 可以解决所有问题 * 注意:隔离级别从小到大安全性越来越高,但是效率越来越低 * 数据库查询隔离级别: SELECT @@tx_isolation; * 数据库设置隔离级别 SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串; 来源: CSDN 作者: l0510402015 链接: https://blog.csdn.net/l0510402015/article

数据库的隔离级别

依然范特西╮ 提交于 2020-02-12 12:21:45
为什么会出现“脏读”?因为“select”操作没有规矩。 为什么会出现“不可重复读”?因为“update”操作没有规矩。 为什么会出现“幻读”?因为“insert”和“delete”操作没有规矩。 一般的数据库都包括以下四种隔离级别: 读未提交(read uncommitted) 读提交(read committed):是sql server 和 oracle的默认隔离级别 可重复读(repeated read):mysql默认隔离级别 串行化(serializable) “读未提(Read Uncommitted)”能预防啥?啥都预防不了。 “读提交(Read Committed)”能预防啥?使用“快照读(Snapshot Read)”,避免“脏读”,但是可能出现“不可重复读”和“幻读”。 “可重复读(Repeated Red)”能预防啥?使用“快照读(Snapshot Read)”,锁住被读取记录,避免出现“脏读”、“不可重复读”,但是可能出现“幻读”。 “串行化(Serializable)”能预防啥?排排坐,吃果果,有效避免“脏读”、“不可重复读”、“幻读”,不过效果谁用谁知道。 来源: CSDN 作者: Ha_Pipi 链接: https://blog.csdn.net/Ha_Pipi/article/details/104259215

InnoDB的锁类别与隔离级别

柔情痞子 提交于 2020-02-10 21:28:23
1.InnoDB的锁类别 SELECT @@tx_isolation; --MySQL 8.0 新增表 select * from performance_schema.data_locks; 行锁: 共享锁与排他锁(Shared and Exclusive Lock) 记录锁(Record Lock) 间隙锁(Gap Lock) 记录锁与间隙锁的组合(Next-Key Lock) 插入意向锁(Insert Intention Lock) 表锁 意向锁(Intention Lock):意向共享锁IS,意向排他锁IX 自增锁(AUTO-INC Lock) 2.Repeatable-read隔离级别(MySQL 默认) 3.Read-Committed隔离级别 来源: CSDN 作者: xianjuke008 链接: https://blog.csdn.net/xianjuke008/article/details/104253088