隔离级别

InnoDB 事务加锁分析

六月ゝ 毕业季﹏ 提交于 2020-02-10 11:16:22
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/S7MhlsZveBHRSQhq5aTIJA 作者:何志创 一般大家对数据库事务的了解可能停留在事务的ACID特性以及事务4种不同的隔离级别层面上,而对于事务 4 种不同隔离级别如何实现了解相对较少。 本文以 MySQL 数据库 InnoDB 引擎为例,为大家分析 InnoDB数据库引擎对默认的隔离级别可重复读(RR)的具体实现。 整文知识点介绍:事务4种隔离级别、不同隔离级别解决的问题、MVCC、锁的类型、加锁案例分析;阅读完整文相信大家对事务隔离级别的具体实现有了一定的认识。 一、事务的隔离级别 1、4 种隔离级别 (1)未提交读(Read uncommitted): 一个事务读取到其他事务未提交的数据,是级别最低的隔离机制; (2)提交读(Read committed): 一个事务读取到其他事务提交后的数据; (3)可重复读(Repeatable read): 一个事务对同一份数据读取到的相同,不在乎其他事务对数据的修改; (4)序列化(Serializable) : 事务串行化执行,隔离级别最高,牺牲了系统的并发性。 2、不同隔离级别解决的问题 若不考虑事务的隔离级别,则事务的并发会造成以下问题: (1)脏读: 事务A读取了事务B更新的数据,然后B回滚操作

数据库的索引和锁

荒凉一梦 提交于 2020-02-09 20:10:34
一、索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度 表经常进行 INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。 -索引需要占物理和数据空间。 了解过索引的最左匹配原则 知道索引的分类:聚集索引和非聚集索引 Mysql支持Hash索引和B+树索引两种 看起来好像啥都知道,但面试让你说的时候可能就GG了: 使用索引为什么可以加快数据库的检索速度啊? 为什么说索引会降低插入、删除、修改等维护任务的速度。 索引的最左匹配原则指的是什么? Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗? 聚集索引和非聚集索引有什么区别? … 1.1聊聊索引的基础知识 首先Mysql的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表 而每个数据页中的记录又可以组成一个单向链表 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。 所以说,如果我们写 select*fromuserwhereusername='Java3y’这样没有进行任何优化的sql语句

事务的特性和隔离级别

不想你离开。 提交于 2020-02-09 14:20:39
事务特性 原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚, 一致性(Consistency)   一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之 前和执行之后都必须处于一致性状态。 隔离性(Isolation)   隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不 能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 持久性(Durability)    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 不考虑事务的隔离性,会发生的几种问题 不考虑事务的隔离性会发生以下情况:    1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据   2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。   3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。 事务的隔离级别: 现在来看看 MySQL

事务隔离的级别

房东的猫 提交于 2020-02-08 09:24:28
隔离级别的定义:   事务指定一个隔离级别,该隔离级别定义一个事务必须与由其他事务进行的资源或数据更改相隔离的程度。隔离级别从允许的并发副作用(例如,脏读或幻读)的角度进行描述。 隔离级别的特性: ⑴ 原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。 ⑵ 一致性(Consistency)   一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。   拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。 ⑶ 隔离性(Isolation)   隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。   即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。   关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。 ⑷

MySQL的四种事务隔离级别

让人想犯罪 __ 提交于 2020-02-08 06:02:56
一、事务的四大特性(ACID) (1)原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚. (2)一致性(Consistency) 一个事务执行之前和执行之后都必须处于一致性状态。 例如:A和用户B两者的钱加起来一共是,A和B之间无论如何转账,转几次账,事务结束后两个用户的钱相加起来应该是5000,这就是事务的一致性。 (3)隔离性(Isolation) 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束, 要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。隔离级别见下文。 (4)持久性(Durability) 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 二、MySQL事务隔离级别 1.读未提交(造成脏读)   读取其他事物未提交的结果。   公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金额不对

数据库事务的四大特性以及隔离级别

此生再无相见时 提交于 2020-02-07 15:51:54
本篇文章主要介绍数据库事务的四大特性ACID,以及数据库的隔离级别。 事务 概念 事务指的是满足 ACID 特性的一系列操作。在数据库中,可以通过 Commit提交一个事务,也可以使用 Rollback 进行回滚。 四大特性 原子性(Atomicity):事务被视为不可分割的最小单元,要么全部提交成功,要么全部失败回滚。 一致性(Consistency):事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。 隔离性(Isolation):一个事务所做的修改在最终提交以前,对其它事务是不可见的。 持久性(Durability):一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。 在了解完数据库的四大特性之后,我们来讨论一下数据库的隔离级别的问题。在此之前,我们考虑在没有数据库隔离性的情况下,多用户并发操作可能会发生的问题。 并发一致性问题 在并发环境下,一个事务如果受到另一个事务的影响,那么事务操作就无法满足一致性条件。 丢失修改:多个事务同时读取某一数据,一个事务成功处理好了数据,被另一个事务写回原值,造成第一个事务更新丢失。例如,T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。 脏读

Mysql得隔离级别

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

Mysql事务的隔离级别

只愿长相守 提交于 2020-02-01 09:17:43
注:转 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion

2020/01/29 02-事务ACID和隔离级别

北战南征 提交于 2020-02-01 04:18:14
事务是由若干条语句组成的,指的是要做的一系列操作。 关系型数据库中支持事务,必须支持4个属性,ACID A 原子性 atomicity 一个事务是一个不可分割的工作单位,事务中包括的所有操作要么全部做完,要么什么都不做 C 一致性 consistency 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的 I 隔离性 isolation 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离 , 的,并发执行的各个事务之间不能互相干扰 D 持久性 durability 持久性也称永久性(permanence)。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响 原子性,事务要么不做,要么做完 **并行执行事务和顺序执行事务的结果应该一致,当这些操作做完之后,多个事务执行完,要求并行执行和排队执行结果是一致的 ** 每个事务的操作不互相干扰, 事务一旦提交成功,数据库的改变就应该永久保存下来 做到这4点,才能叫支持事务的数据库,mysql的myisam不支持事务,innodb支持事务,一般需要解释下ACID,原子性,一致性(要求并行,且互不干扰),隔离性,持久性, 隔离级别 隔离性不好,会带来一些问题: 1.更新丢失 2.脏读 3.不可重复读 UNrepeatable

浅谈数据库事务

天大地大妈咪最大 提交于 2020-01-31 15:59:42
文章目录 隔离级别 数据库事务的知识 详解隔离级别 传播行为 传播行为的定义 @Transactional 调用失效问题 隔离级别 数据库事务的知识 数据库事务具有以下4 个基本特征, 也就是著名的ACID 。 Atomic (原子性):事务中包含的操作被看作一个整体的业务单元, 这个业务单元中的操作要么全部成功,要么全部失败,不会出现部分失败、部分成功的场景。 Consistency (一致性):事务在完成时,必须使所有的数据都保持一致状态,在数据库中所有的修改都基于事务,保证了数据的完整性。 Isolation (隔离性): 这是我们讨论的核心内容,正如上述,可能多个应用程序线程同时访问同一数据,这样数据库同样的数据就会在各个不同的事务中被访问,这样会产生丢失更新。为了压制丢失更新的产生,数据库定义了隔离级别的概念,通过它的选择,可以在不同程度上压制丢失更新的发生。因为互联网的应用常常面对高并发的场景,所以隔离性是需要掌握的重点内容。 Durability (持久性):事务结束后,所有的数据会固化到一个地方,如保存到磁盘当中,即使断电重启后也可以提供给应用程序访问。 详解隔离级别 未提交读 未提交读( read uncommitted )是最低的隔离级别,其含义是允许一个事务读取另外一个事务没有提交的数据。未提交读是一种危险的隔离级别,所以一般在我们实际的开发中应用不广,