sql
文章平均质量分 58
鸭梨山大哎
life hard take it easy
展开
-
innodb逻辑存储结构
InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block),1 extent = 64 pages,InnoDB存储引擎的逻辑存储结构大致如图所示。段上图中显示了表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。InnoDB存储引擎表是索引组织的(index organized),因此数据即索引,索引即数原创 2021-09-30 09:04:49 · 297 阅读 · 1 评论 -
MySQL 基数的定义
MySQL Cardinality 定义了一个术语,指的是要放入表列中的数据值的独特性。我们可以进一步说,在 MySQL 中,基数作为影响搜索、排序甚至数据聚类过程能力的属性负责。SHOW INDEX FROM a应改为Cardinality值比较大的列创建索引参考MySQL中Cardinality值的介绍 - 懒睡的猫熊 - 博客园...原创 2021-09-29 19:13:23 · 217 阅读 · 0 评论 -
Innodb缓冲池
缓冲池是主内存中的一个区域,用于在 InnoDB访问时缓存表和索引数据。缓冲池允许直接从内存访问经常使用的数据,从而加快处理速度。在专用服务器上,多达 80% 的物理内存通常分配给缓冲池。为了提高大量读取操作的效率,缓冲池被划分为可能包含多行的页面。为了缓存管理的效率,缓冲池被实现为页面的链表;很少使用的数据使用最近最少使用 (LRU) 算法的变体从缓存中老化。了解如何利用缓冲池将经常访问的数据保存在内存中是 MySQL 调优的一个重要方面。缓冲池 LRU 算法缓冲池使用 **LRU 算法的变体**原创 2021-09-29 09:24:26 · 447 阅读 · 0 评论 -
InnoDB 行格式
InnoDB表 的默认行格式由innodb_default_row_format 变量定义 ,其默认值为DYNAMIC。当ROW_FORMATtable 选项未明确定义或ROW_FORMAT=DEFAULT指定时,将使用默认行格式 。可以使用or 语句中的ROW_FORMAT选项 显式定义表的行格式 。例如:CREATE TABLE t1 (c1 INT) ROW_FORMAT=DYNAMIC;查看行格式 SHOW TABLE STATUS IN db2或者SELECT NAME, R原创 2021-09-28 13:42:47 · 623 阅读 · 0 评论 -
数据库存储引擎对比
B 树类B 树就是可以修改类存储引擎比较典型的一个代表。它是目前的分布式数据库,乃至于一般数据库最常采用的数据结构。它是为了解决搜索树(BST)等结构在 HDD 磁盘上性能差而产生的,结构特点是高度很低,宽度很宽。检索的时候从上到下查找次数较少,甚至如 B+ 树那样,可以完全把非叶子节点加载到内存中,从而使查找最多只进行一次磁盘操作。下面让我介绍几种典型的 B 树结构的存储引擎。InnoDBInnoDB 是目前 MySQL 的默认存储引擎,同时也是 MariaDB 10.2 之后的默认存储引擎。根原创 2021-08-07 09:44:22 · 666 阅读 · 0 评论 -
评估数据库存储引擎的黄金三角
存储引擎的特点千差万别,各具特色。但总体上我们可以通过三个变量来描述它们的行为:缓存的使用方式,数据是可变的还是不可变的,存储的数据是有顺序的还是没有顺序的。缓存形式缓存是说存储引擎在数据写入的时候,首先将它们写入到内存的一个片段,目的是进行数据汇聚,而后再写入磁盘中。这个小片段由一系列块组成,块是写入磁盘的最小单位。理想状态是写入磁盘的块是满块,这样的效率最高。大部分存储引擎都会使用到缓存。但使用它的方式却很不相同,比如我将要介绍的 WiredTiger 缓存 B 树节点,用内存来抵消随机读写的性能原创 2021-08-07 09:36:33 · 120 阅读 · 0 评论 -
失败模型入门
分布式数据库区别于传统数据库的一个重要特性就是其分布式的特点,这些特点来源于分布式理论的发展,特别是数据分布相关理论的发展。相比于无状态分布式系统,有状态的数据库在分布式领域中将会面对更多的挑战。失败模型分布式系统是由多个节点参与其中的,它们直接通过网络进行互联。每个节点会保存本地的状态,通过网络来互相同步这些状态;同时节点需要访问时间组件来获取当前时间。对于分布式系统来说,时间分为逻辑时间与物理时间。逻辑时间一般被实现为一个单调递增的计数器,而物理时间对应的是一个真实世界的时间,一般由操作系统提供。原创 2021-08-06 17:13:26 · 792 阅读 · 0 评论 -
共识算法入门
要想解决失败问题,首先就是要进行侦测。目前,业界有众多方式来检测故障的产生,他们是在易用性、精确性和性能之间做平衡。错误侦测有什么用?错误侦测一个重要应用领域就是领导选举。使用错误侦测技术来检测领导节点的健康状态,从而决定是否选择一个新节点来替代已经故障的领导节点。领导节点的一个主要作用就是缓解系统发生失败的可能。我们知道系统中如果进行对等同步状态的代价是很高昂的,如果能选择一个领导节点来统一进行协调,那么会大大降低系统负载,从而避免一些失败的产生。什么是共识算法?最后我们将介绍分布式系统的精华:共原创 2021-08-06 17:12:45 · 136 阅读 · 0 评论 -
拜占庭失败
拜占庭失败又称为任意失败,它相比于上述两种失败是最不好预测的。所谓任意失败是,参与的节点对请求产生不一致的响应,一个说当前数据是 A,而另一个却说它是 B。这个故障往往是程序 Bug 导致的,可以通过严格软件开发流程管理来尽可能规避。但我们都清楚,Bug 在生产系统中是很难避免的,特别是系统版本差异带来的问题是极其常见的。故在运行态,一部分系统并不信任直接从远程节点获得的数据,而是采用交叉检测的方式来尽可能得到正确的结果。另一种任意失败是一些节点故意发送错误消息,目的是想破坏系统的正常运行,从而牟利原创 2021-08-06 17:06:16 · 4841 阅读 · 1 评论 -
LSM 树的结构
LSM 树存储引擎的结构暗含在它的名字内。LS 代表日志结构,说明它是以日志形式来存储数据的,那么日志有什么特点呢?如果你对财务记账有些了解的话,会知道会计在删除一笔记录时,是不会直接拿着橡皮擦去擦掉这个记录的,而是会写一笔与原金额相等的冲抵操作。这就是典型的日志型存储的模式。日志型存储的特点是对写入非常友好,不像 B 树等结构需要进行随机写,日志存储可以进行顺序性写。因为我们常用的 HDD 磁盘是有旋转机构的,写入延迟主要发生在磁盘旋转与读写臂的移动上。如果数据可以顺序写入,可以大大加快这种磁盘机构的写原创 2021-08-05 18:06:23 · 446 阅读 · 0 评论 -
如何在内存中存储有序数据?
目前有很多种不同的数据结构可以在内存中存储有序的数据。在分布式数据库的存储引擎中,有一种结构因其简单而被广泛地使用,那就是跳表(SkipList)。跳表的优势在于其实现难度比简单的链表高不了多少,但是其时间复杂度可以接近负载平衡的搜索树结构。跳表在插入和更新时避免对节点做旋转或替换,而是使用了随机平衡的概念来使整个表平衡。跳表由一系列节点组成,它们又由不同的高度组成。连续访问高度较高的节点可以跳过高度较低的节点,有点像蜘蛛侠利用高楼在城市内快速移动一样,这也就是跳表名称的来源。现在我们用一个例子来说明跳原创 2021-08-05 17:54:35 · 412 阅读 · 0 评论 -
索引数据表入门
我在前文提到过,含有索引的数据表有索引组织表和哈希组织表。其实,我们在分布式数据库中最常见的是 Google 的 BigTable 论文所提到的 SSTable(排序字符串表)。Google 论文中的原始描述为:SSTable 用于 BigTable 内部数据存储。SSTable文件是一个排序的、不可变的、持久化的键值对结构,其中键值对可以是任意字节的字符串,支持使用指定键来查找值,或通过给定键范围遍历所有的键值对。每个SSTable 文件包含一系列的块。SSTable 文件中的块索引(这些块索引通原创 2021-08-05 17:38:44 · 210 阅读 · 0 评论 -
分布式索引入门
说到分布式索引时,我们在谈论什么?首先,我要说明一下谈到分布式索引,需要了解什么样的内容。你已经知道存储引擎中包含数据文件和索引文件,同时索引文件中又有索引组织表这种主要的形式。目前世界上主要的分布式数据库的数据存储形式,就是围绕着索引而设计的。为什么会这样呢?由于分布式数据库的数据被分散在多个节点上,当查询请求到达服务端时,目标数据有极大的概率并不在该节点上,需要进行一次甚至多次远程调用才可查询到数据。由于以上的原因,在设计分布式数据库存储引擎时,我们更希望采用含有索引的数据表,从而减少查询的延迟原创 2021-08-05 17:28:58 · 1074 阅读 · 0 评论 -
数据库存储引擎
数据库的一个首要目标是可靠并高效地管理数据,以供人们使用。进而不同的应用可以使用相同的数据库来共享它们的数据。数据库的出现使人们放弃了为每个独立的应用开发数据存储的想法,同时,随着数据库广泛的使用,其处理能力飞速发展,演进出如现代的分布式数据库这般惊人的能力。那么,为了支撑抽象的多种场景。一般的数据库都会采用多模块或多子系统的架构来构建数据库,从而方便数据库项目团队依据现实的场景来组合不同的子模块,进而构造出一众丰富的数据库产品。而存储引擎就是这一众模块中极为重要的一环,下面我们开始解释它在整个数据库架原创 2021-08-05 10:31:36 · 109 阅读 · 0 评论 -
MySQL 复制技术的发展
MySQL 由于其单机机能的限制,很早就发展了数据复制技术以提高性能。同时依赖该技术,MySQL 可用性也得到了长足的发展。截止到现在,该技术经历了四代的发展。第一代为传统复制,使用 MHA(Master High Available)架构;第二代是基于 GTID 的复制,即 GTID+Binlog server 的模式;第三代为增强半同步复制,GTID+增强半同步复制;第四代为 MySQL 原生高可用,即 MySQL InnoDB Cluster。数据库的复制技术需要考虑两个因素:数据一致原创 2021-08-05 09:38:45 · 294 阅读 · 0 评论 -
数据库复制方式
为了灵活并高效地复制数据,下面我介绍几种常用的复制方式。1. 基于语句的复制主库记录它所执行的每个写请求(一般以 SQL 语句形式保存),每个从库解析并执行该语句,就像从客户端收到该语句一样。但这种复制会有一些潜在问题,如语句使用了获取当前时间的函数,复制后会在不同数据节点上产生不同的值。另外如自增列、触发器、存储过程和函数都可能在复制后产生意想不到的问题。但可以通过预处理规避这些问题。使用该复制方式的分布式数据库有 VoltDB、Calvin。2. 日志(WAL)同步WAL 是一组字节序列,其中原创 2021-08-05 09:30:01 · 2032 阅读 · 0 评论 -
单主复制与多主复制入门
单主复制单主复制,也称主从复制。写入主节点的数据都需要复制到从节点,即存储数据库副本的节点。当客户要写入数据库时,他们必须将请求发送给主节点,而后主节点将这些数据转换为复制日志或修改数据流发送给其所有从节点。从使用者的角度来看,从节点都是只读的。下图就是经典的主从复制架构。这种模式是最早发展起来的复制模式,不仅被广泛应用在传统数据库中,如 PostgreSQL、MySQL、Oracle、SQL Server;它也被广泛应用在一些分布式数据库中,如 MongoDB、RethinkDB 和 Redis 等原创 2021-08-05 09:26:40 · 1212 阅读 · 0 评论 -
数据分片入门
数据分片概论分片是将大数据表分解为较小的表(称为分片)的过程,这些分片分布在多个数据库集群节点上。分片本质上可以被看作传统数据库中的分区表,是一种水平扩展手段。每个分片上包含原有总数据集的一个子集,从而可以将总负载分散在各个分区之上。数据分片的方式一般有两种。水平分片:在不同的数据库节点中存储同一表的不同行。垂直分片:在不同的数据库节点中存储表不同的表列。如下图所示,水平和垂直这两个概念来自原关系型数据库表模式的可视化直观视图。图 1 可视化直观视图分片理念其实来源于经济学的边际收益理论原创 2021-08-04 19:47:46 · 774 阅读 · 0 评论 -
SQL vs NoSQL:一次搞清楚五花八门的“SQL”
21 世纪的开发者往往要面对一种窘境:需在众多的数据库中艰难地做出选择。他们其实也想如老一辈技术人一样闭着眼睛去选择 Oracle 或者 DB2,因为它们曾经被证明是“不会出错”的选择,即无论选择哪款数据库,都不会丢工作。而时至今日,时代变了,我们如果不了解各种数据库内部的机理,即使选择大厂的成熟产品也有可能掉进“坑”里。因此,选择合适的数据库就成了日常工作中一项必备技能。当然数据库的分类有各种各样的维度,在过去的 20 年中有一种分类法被广泛采用:SQL(关系型数据库)VS NoSQL(其他类型数据库原创 2021-08-04 09:45:11 · 337 阅读 · 0 评论 -
什么是分布式数据库
基本概念分布式数据库,从名字上可以拆解为:分布式+数据库。用一句话总结为:由多个独立实体组成,并且彼此通过网络进行互联的数据库。理解新概念最好的方式就是通过已经掌握的知识来学习,下表对比了大家熟悉的分布式数据库与集中式数据库之间主要的 5 个差异点。分布式数据库的核心——数据分片、数据同步。1. 数据分片该特性是分布式数据库的技术创新。它可以突破中心化数据库单机的容量限制,从而将数据分散到多节点,以更灵活、高效的方式来处理数据。这是分布式理论带给数据库的一份礼物。分片方式包括两种。水平分片:原创 2021-08-04 09:24:45 · 24889 阅读 · 2 评论 -
分库分表 or 中间件 ?
访问分布式数据库有两种模式:业务直接根据分库分表访问 MySQL 数据库节点;根据中间件访问。我们先来看一看业务直接访问分布式数据库的场景分库分表直接访问在设计分片时,我们已经明确了每张表的分片键信息,所以业务或服务可以直接根据分片键对应的数据库信息,直接访问底层的 MySQL 数据节点,比如在代码里可以做类似的处理:void InsertOrders(String orderKey, int userKey...) { int shard_id = userKey % 4;原创 2021-08-01 07:41:50 · 137 阅读 · 0 评论 -
分库分表入门
如何确定分片键?_鸭梨的博客-CSDN博客说了这么久分片,分片到底是什么呢?其实,前面说的分片本质是一张张表,而不是数据库实例,只是每个分片是在 MySQL 数据库实例中,严格来说:分片 = 实例 + 库 + 表 = ip@port:db_name:table_name对于前面的表orders,假设根据 HASH 算法进行分片,那么可以进行如下的分库分表设计:每个分片的表名库名都一样,如库 tpch,表名 orders;每个分片的库名不一样,表名一样,如库名 tpch01、tpch02、tpc原创 2021-08-01 07:23:14 · 181 阅读 · 0 评论 -
如何确定分片键?
在对表中的数据进行分片时,首先要选出一个分片键(Shard Key),即用户可以通过这个字段进行数据的水平拆分。对于我们之前使用的电商业务的订单表orders,其表结构如下所示:CREATE TABLE `orders` ( `O_ORDERKEY` int NOT NULL, `O_CUSTKEY` int NOT NULL, `O_ORDERSTATUS` char(1) NOT NULL, `O_TOTALPRICE` decimal(15,2) NOT NULL, `O_OR原创 2021-08-01 07:10:57 · 799 阅读 · 0 评论 -
事务隔离的实现
在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。当前值是 4,但是在查询这条记录的时候,不同时刻启动的事务会有不同的 read-view。如图中看到的,在视图 A、B、C 里面,这一个记录的值分别是 1、2、4,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。对于 read-view A,要得到 1,就必须将当前值原创 2021-07-11 10:42:45 · 86 阅读 · 0 评论 -
mysql 事务操作入门
事务案例测试CREATE TABLE `t` ( `id` int(11) NOT NULL, `k` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;insert into t(id, k) values(1,1),(2,2);测试BEGIN;INSERT INTO t(id, k) VALUES(3,3),(4,4);ROLLBACK;COMMIT;SELECT * FROM t可以看到,3 4 并没原创 2021-07-11 10:36:34 · 65 阅读 · 0 评论 -
InnoDB如何实现多版本
InnoDB是一个多版本的存储引擎。它保留有关已更改行的旧版本的信息以支持事务功能,例如并发和回滚。该信息以称为rollback segment的数据结构存储在系统表空间或撤消表空间中。InnoDB 使用rollback segment中的信息来执行事务回滚所需的撤消操作。它还使用这些信息来构建行的早期版本以实现一致读取。在内部,InnoDB为存储在数据库中的每一行添加三个字段:一个 6 字节DB_TRX_ID字段指示插入或更新行的最后一个事务的事务标识符。此外,删除在内部被视为更新,其中设置了行中的特原创 2021-07-11 09:54:22 · 194 阅读 · 0 评论 -
事务到底是隔离的还是不隔离的?
如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view(如何创建),之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,我在上一篇文章中,和你分享行锁的时候又提到,一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,它读到的值又是什么呢?原创 2021-07-11 09:40:48 · 104 阅读 · 2 评论 -
数据的水平切分
一般来说,简单的水平切分主要是将某个访问极其频繁的表再按照某个字段的某种规则分散到多个表中,每个表包含一部分数据。简单来说,可以将数据的水平切分理解为按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。当然,为了能够比较容易地判定各行数据被切分到哪个数据库中了,切分总是须要按照某种特定的规则来进行的:如根据某个数字类型字段基于特定数目取模,某个时间类型字段的范围,或者某个字符类型字段的hash值。如果整个系统中大部分核心表都可以通过某个字段来进行关联,那这个原创 2021-07-10 13:30:03 · 245 阅读 · 1 评论 -
理解InnoDB数据及索引文件存储格式
InnoDB存储引擎的数据(包括索引)存放在相同的文件中,这一点和MySQL默认存储引擎MyISAM的区别较大,后者分别存放于独立的文件。除此之外,InnoDB的数据存放格式也比较独特,每个InnoDB表都会将主键以聚簇索引的形式创建。所有的数据都以主键升序排列在物理磁盘上面,所以主键查询并且以主键排序的查询效率也会非常高。由于主键是聚簇索引的,InnoDB基于主键的查询效率非常高。如果在创建一个InnoDB存储引擎表时并没有创建主键,那么InnoDB会尝试创建于表上的其他索引。如果存在由单个not nu转载 2021-07-09 22:05:00 · 1864 阅读 · 1 评论 -
InnoDB缓存相关优化
从定义来看,分布式数据库是一种把数据分散存储在不同物理位置的数据库。对比我们之前学习的数据库,数据都是存放在一个实例对应的物理存储上,而在分布式数据库中,数据将存放在不同的数据库实例上。从图中我们可以看到,在分布式数据库下,分布式数据库本身分为计算层、元数据层和存储层:计算层就是之前单机数据库中的 SQL 层,用来对数据访问进行权限检查、路由访问,以及对计算结果等操作。元数据层记录了分布式数据库集群下有多少个存储节点,对应 IP、端口等元数据信息是多少。当分布式数据库的计算层启动时,会先访问元数据原创 2021-07-09 21:49:42 · 177 阅读 · 0 评论 -
mysql explain select_type
(1)SIMPLE简单的SELECT语句(不包括UNION操作或子查询操作)EXPLAIN SELECT * FROM t1;(2)PRIMARY/UNIONPRIMARY:查询中最外层的SELECTUNION:UNION操作中,查询中处于内层的SELECTEXPLAIN SELECT * FROM t1 UNION ALL SELECT * FROM t2;(3)DEPENDENT UNION/UNIOIN RESULT参考mysql 查询优化 ~explain解读之select_t原创 2021-07-09 08:24:29 · 314 阅读 · 0 评论 -
mysql 全局权限入门
为了便于说明,我先创建一个用户:create user 'ua'@'%' identified by 'pa';这条语句的逻辑是创建一个用户’ua’@’%’,密码是 pa。注意,在 MySQL 里面,用户名 (user)+ 地址 (host) 才表示一个用户,因此 ua@ip1 和 ua@ip2代表的是两个不同的用户。这条命令做了两个动作:磁盘上,往 mysql.user 表里插入一行,由于没有指定权限,所以这行数据上所有表示权限的字段的值都是 N;内存里,往数组 acl_users原创 2021-07-09 08:18:51 · 931 阅读 · 0 评论 -
内存表与 InnoDB表对比
为了便于分析,我来把这个问题简化一下,假设有以下的两张表 t1 和 t2,其中表 t1 使用 Memory 引擎, 表 t2 使用 InnoDB 引擎。CREATE TABLE t1 ( id int PRIMARY KEY, c int) ENGINE = Memory;CREATE TABLE t2 ( id int PRIMARY KEY, c int) ENGINE = innodb;INSERT INTO t1VALUES (1, 1), (2, 2), (3, 3),原创 2021-07-09 08:07:17 · 241 阅读 · 2 评论 -
Hash Join
MySQL 中的第二种 JOIN 算法是 Hash Join,用于两张表之间连接条件没有索引的情况。有同学会提问,没有连接,那创建索引不就可以了吗?或许可以,但:如果有些列是低选择度的索引,那么创建索引在导入数据时要对数据排序,影响导入性能;二级索引会有回表问题,若筛选的数据量比较大,则直接全表扫描会更快。对于 OLAP 业务查询来说,Hash Join 是必不可少的功能,MySQL 8.0 版本开始支持 Hash Join 算法,加强了对于 OLAP 业务的支持。所以,如果你的查询数据量不是特原创 2021-07-08 22:14:06 · 264 阅读 · 0 评论 -
Nested Loop Join入门
Nested Loop Join 之间的表关联是使用索引进行匹配的,假设表 R 和 S 进行连接,其算法伪代码大致如下:for each row r in R with matching condition: lookup index idx_s on S where index_key = r if (found) send to client在上述算法中,表 R 被称为驱动表,表 R 中通过 WHERE 条件过滤出的数据会在表 S 对应的索引上进行一一查询。如果驱动表原创 2021-07-08 22:10:15 · 1496 阅读 · 1 评论 -
Mysql JOIN连接算法
MySQL 8.0 版本支持两种 JOIN 算法用于表之间的关联:Nested Loop Join;Hash Join。通常认为,在 OLTP 业务中,因为查询数据量较小、语句相对简单,大多使用索引连接表之间的数据。这种情况下,优化器大多会用 Nested Loop Join 算法;而 OLAP 业务中的查询数据量较大,关联表的数量非常多,所以用 Hash Join 算法,直接扫描全表效率会更高。...原创 2021-07-08 22:01:09 · 94 阅读 · 0 评论 -
Mysql 可重复读
可重复读是一个较高的隔离级别,除了保证已提交读级别外,它还保证任何读取的数据都不能更改,如果事务再次读取相同的数据,它将找到原先读取的数据,并且保持不变,可供阅读。-一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。-从事务开始就维护数据库的状态。如果您在会话1中检索到一个值,则在会话2中更新该值,然后在会话1中再次检索该值将返回相同的结果。读取是可重复的。create table T( c int) engine = InnoDB;insert into原创 2021-07-08 21:57:40 · 2506 阅读 · 0 评论 -
mysql读提交
它只是限制了读者看不到任何中间的,未提交的“脏”读物。create table T( c int) engine = InnoDB;insert into T(c)values (1);如果是读提交隔离级别,那么V1=1,V2=2,V3=2测试案例读提交的实现原理总结读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。读提交就是事务完成后才能读到变化!!oracle默认级别就是读提交...原创 2021-07-08 21:49:28 · 243 阅读 · 0 评论 -
Mysq 隔离级别操作
mysql隔离级别有几种?1)read uncommitted : 读取尚未提交的数据 :就是脏读2)read committed:读取已经提交的数据 :可以解决脏读3)repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表如何查看隔离级别?首先查看隔离级别SHOW VARIABLES LIKE '%isolation%';如何修改隔离级别?SET原创 2021-07-08 21:44:37 · 83 阅读 · 0 评论 -
mysql隔离性与隔离级别
提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。在谈隔离级别之前,你首先要知道,你隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间原创 2021-07-08 21:35:03 · 97 阅读 · 0 评论