隔离级别

MySQL重要知识点/面试题总结

≯℡__Kan透↙ 提交于 2019-11-28 20:05:37
这篇文章是作者利用几天时间对MySQL知识点总结完善后的产物,可以用来回顾MySQL基础知识以及备战MySQL常见面试问题。 什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。 事务相关 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 事物的四大特性(ACID)介绍一下? 原子性 : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性 : 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; 隔离性 : 并发访问数据库时,一个用户的事务不被其他事务所干扰

数据库知识点

假装没事ソ 提交于 2019-11-28 16:23:52
数据库 1、关系型数据库 架构、索引、锁、语法、理论范式 2、如何设计一个关系型数据库 3、索引模块 3.1、为什么要用索引? 1、加快查询数据速度(在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引的出现就是为了提高查询效率,就像书的目录。其实说白了,索引要解决的就是查询问题。) 3.2、什么样的信息能成为索引? 1、主键、唯一键和普通键等 3.3、索引的数据结构是什么样的? 主流索引是B+Tree 。此外还有hash结构和bitmap等,其中mysql不支持bitmap索引。 1、生成索引、建立二叉查找树进行二分查找(平衡二叉树、线性二叉树、) 影响程序的数据速率和io还有关系,数据库中二叉树查找每一个深度就会产生一次IO。 2、生成索引、建立B-Tree结构进行查找 → 根节点至少包括两个孩子。 → 树中每个节点最多含有m个孩子(m>=2) → 除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子 Ceil:取上限 → 所有叶子节点都位于同一层,叶子节点的高度相同 3.3.1、B-Tree 3、生成索引、建立B+-Tree结构进行查找(MySQL主要是通过此方式实现索引) 4、生成索引、建立Hash结构进行查找 3.3.2、B+Tree

隔离级别引发问题实验

倾然丶 夕夏残阳落幕 提交于 2019-11-28 14:58:50
继续上篇博客 事务特性及隔离问题。 我们来做一个关于隔离级别的实验,将演示各个级别导致的隔离问题。 我们先打开两个MySQL窗口,来模拟并发操作。 脏读 只有Read uncommitted级别才会发生脏读问题,所以将其中一个窗口的隔离级别设置为Read uncommitted。输入 set transaction isolation level Read uncommitted; 在MySQL5.5的64位版本中输入该段代码是无法修改隔离级别的,应该输入 set session transaction isolation level read committed; 修改隔离级别后,该窗口就被允许发生脏读。现在给这两个窗口命名一下,方便后续讲解,我们就令设置了事务隔离级别的窗口为B,另一个窗口为A。 在A、B窗口分别开启一个事务,输入 start transaction; 现在同时查看两个用户的表数据 现在在A窗口完成转账操作,输入 update account set money = money - 200 where name = 'aaa'; update account set money = money + 200 where name = 'bbb'; 然后查询表数据 转账操作成功执行。 此时在B窗口进行查询 左边是A窗口,右边是B窗口 会发现

MYSQL 事务隔离级别

非 Y 不嫁゛ 提交于 2019-11-28 14:45:34
事务的ACID特性: 原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中的所有操作要么都做,要么都不做。 一致性(consistency):事务前后数据的完整性必须保持一致.事务必须是使数据库从一个一致性状态变到另一个一致性状态,一致性与原子性是密切相关的。 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。有四种隔离级别 持久性(durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 隔离性的四种级别 来源: https://www.cnblogs.com/viczhang/p/11410388.html

Hibernate多事物并发访问控制

僤鯓⒐⒋嵵緔 提交于 2019-11-28 14:23:26
在并发环境,一个数据库系统会同时为各种各样的客户程序提供服务,也就是说,在同一时刻,会有多个客户程序同时访问数据库系统,这多个客户程序中的失误访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种各样的并发问题的发生,这些并发问题可归纳为以下几类 多个事务并发引起的问题: 1)第一类丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。 2)脏读:一个事务读到另一个事务未提交的更新数据。 3) 幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。 4)不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。 5)第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。 事务隔离级别 为了解决多个事务并发会引发的问题。数据库系统提供了四种事务隔离级别供用户选择。 1) Serializable:串行化。隔离级别最高 2) Repeatable Read:可重复读。--MySQL默认是这个 3) Read Committed:读已提交数据。--Oracle默认是这个 4) Read Uncommitted:读未提交数据。隔离级别最差。--sql server默认是这个 数据库系统采用不同的锁类型来实现以上四种隔离级别,具体的实现过程对用户是透明的。用户应该关心的是如何选择合适的隔离级别。 对于多数应用程序

Hibernate事务和并发控制

夙愿已清 提交于 2019-11-28 14:22:53
Hibernate事务和并发控制 ++YONG原创,转载请注明 1. 事务介绍: 1.1. 事务的定义: 事务就是指作为单个逻辑工作单元执行的一组数据操作,这些操作要么必须全部成功,要么必须全部失败,以保证数据的一致性和完整性。 1.2. 事务具有 ACID 属性: o 原子性 (Atomic):事务由一个或多个行为绑在一起组成,好像是一个单独的工作单元。原子性确保在事务中的所有操作要么都发生,要么都不发生。 o 一致性 (Consistent):一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。即数据应当不会被破坏。 o 隔离性 (Isolated):事务应该允许多个用户操作同一个数据,一个用户的操作不会和其他用户的操作相混淆。 o 持久性 (Durable):一旦事务完成,事务的结果应该持久化。 事务的ACID特性是由关系数据库管理系统(RDBMS)来实现的。 o 数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。 o 数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

mysql 4种事务隔离级别

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

mysql的隔离级别

﹥>﹥吖頭↗ 提交于 2019-11-28 12:54:01
转自: https://www.cnblogs.com/shoshana-kong/p/10516404.html 知识点总结 ----------------------------------------------------------------------------------------------------------------------- 1.数据库默认隔离级别: mysql ---repeatable,oracle,sql server ---read commited 2.mysql binlog的格式三种:statement,row,mixed 3.为什么mysql用的是repeatable而不是read committed:在 5.0之前只有statement一种格式,而主从复制存在了大量的不一致,故选用repeatable 4.为什么默认的隔离级别都会选用read commited 原因有二:repeatable存在间隙 锁会使死锁的概率增大, 在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行 2.在RC级用别下,主从复制用什么binlog格式: row格式,是基于行的复制! ----------------------------------------------------------------------------

MySQL的四种事务隔离级别

不打扰是莪最后的温柔 提交于 2019-11-28 08:12:28
1.背景   事务在实际开发中必不可少.....直接进入正题 2.事务的4大特征   1、 原子性 (Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。   事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。    2、 一致性 (Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。    3、 隔离性 (Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。    4、 持久性 (Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 3.事务的并发问题   1、 脏读 :事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据   2、 不可重复读 :事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。   3、 幻读 :系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级

ORACLE数据库事务隔离级别

对着背影说爱祢 提交于 2019-11-28 08:11:18
事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。 2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。 3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。 为了处理这些问题,SQL标准定义了以下几种事务隔离级别 READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。 READ COMMITTED 允许幻想读、不可重复读,不允许脏读 REPEATABLE READ 允许幻想读,不允许不可重复读和脏读 SERIALIZABLE 幻想读、不可重复读和脏读都不允许 Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读 SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ