![](https://img-blog.csdnimg.cn/a371f57e915c4c8aa501aa811a85db29.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据库高级
文章平均质量分 85
索引、事务、锁、数据库优化、其他相关问题
呆萌宝儿姐
CSDN专家博主、阿里云开发者社区专家博主、51CTO社区专家博主、360书馆认证博主、知乎掘金B站等平台受邀作者。
如遇开发、程序等需求,博客首页下拉加入公众号,私信博主
展开
-
Redis 事务支持回滚吗?
大概的意思是,Redis 不支持事务回滚,因为支持回滚会对 Redis 的简单性和性能产生重大影响。虽然,Redis不支持事务回滚,但是 Redis 提供了 DISCARD 命令,不过这个命令只能用来主动放弃事务执行,把暂存的命令队列清空,起不到回滚的效果。MySQL 在执行事务时,会提供回滚机制,当事务执行发生错误时,事务中的所有操作都会撤销,已经修改的数据也会被恢复到事务执行前的状态。事务执行过程中,如果命令入队时没报错,而事务提交后,实际执行时报错了,正确的命令依然可以正常执行,所以这可以看出。原创 2023-02-18 23:04:09 · 2440 阅读 · 0 评论 -
Redis事务失效的三种场景
如果发生这种类型的错误,Redis将向客户端返回包含错误提示信息的响应,同时Redis会清空队列中的命令并取消事务。watch 监控 key 所起的作用实际上是一个乐观锁,它所监控的是在事务期间有没有其他客户端对所监控的值进行修改。在事务提交之前,客户端执行的命令缓存(队列)失败,比如命令的语法错误(命令参数个数错误,不支持的命令等等)。事务提交后开始顺序执行命令,之前缓存在队列中的命令有可能执行失败。由于乐观锁失败,事务提交时将丢弃之前缓存的所有命令序列。最后发现事务里语句失效。最后发现事务里语句失效。原创 2022-11-16 11:01:48 · 2298 阅读 · 7 评论 -
Redis能保证ACID的哪些特性?
命令入队时就报错,会放弃事务执行,保证原子性;命令入队时没报错,实际执行时报错,不保证原子性;EXEC 命令执行时实例故障,如果开启了 AOF 日志,可以保证原子性。一致性:能保证一致性隔离性:能保证隔离性持久性:不能保证持久性所以关于 Redis 中事务原子性的总结,就是下面几点命令入队时就报错,会放弃事务执行,保证原子性;命令入队时没报错,实际执行时报错,不保证原子性;EXEC 命令执行时实例故障,如果开启了 AOF 日志,可以保证原子性。原创 2022-11-16 10:44:53 · 1572 阅读 · 0 评论 -
Redis事务相关源码探究
也就所有修改 key 的值的函数,都会去调用 signalModifiedKey 来检查是否修改了被 watch 的 key,只要是修改了被 watch 的 key,就会对 redisClient 的 flags 设置 REDIS_DIRTY_CAS 位。2、每个客户端中也有一个被监听的键值对的列表,当客户端被释放或者 un-watch 被调用,可以取消监听这些 key;通过源码可以看到语法错误的时候事务才会结束执行,如果命令操作的类型不对,事务是不会停止的,还是会把正确的命令执行。原创 2022-11-16 10:41:25 · 1671 阅读 · 2 评论 -
Redis事务入门及命令
事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。执行成功,返回事务块内所有命令的返回值,按命令执行的先后顺序排列。原创 2022-11-16 08:44:54 · 1932 阅读 · 0 评论 -
MySQL语句的执行顺序是怎样的?
from>join>where>group by>聚合函数>having>select >Distinct >order by>limit。原创 2022-09-24 12:38:50 · 2859 阅读 · 0 评论 -
MySQL中 redo log、undo log、bin log的理解
redo log用来实现事务的持久性,undo log用来实现事务的原子性以及MVCC(隔离性),bin log主要用于数据备份。原创 2022-10-27 20:52:23 · 1160 阅读 · 0 评论 -
MySQL实现分库分表代码实战(Mango中间件)
本篇主要介绍Java版使用Mango框架实现Mysql分库分表实战,分库分表中间件也可以使用类似于ShardingJDBC,或者自研。以上分库分表数量仅供演示参考,实际工作中分表数量、分库数量、是根据公司实际业。原创 2022-10-30 23:19:35 · 1787 阅读 · 0 评论 -
Redis八大应用场景是什么?
在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。转载 2022-09-05 16:06:12 · 169 阅读 · 0 评论 -
Redis 主从同步实现过程
与MySQL主从复制的原因一样,Redis虽然读写的速度非常快,但是当读请求较多时也会产生较大的压力,为了分担读Redis的压力,Redis支持了主从复制的架构,从节点可以分担主节点的读压力。Redis的主从复制可以根据是否是全量,分为全量同步和增量同步(也叫全量复制和部分复制)。全量复制一般用于初次复制的场景部分复制则用于处理因网络中断等原因造成数据丢失的场景。原创 2022-10-26 12:58:15 · 1593 阅读 · 0 评论 -
Redis 过期删除机制探究
可以看到,惰性删除策略和定期删除策略都有各自的优点,所以Redis 选择「惰性删除+定期删除」这两种策略配和使用,以求在合理使用 CPU 时间和避免内存浪费之间取得平衡。惰性删除:客户端访问一个key的时候,Redis会先检查它的过期时间,如果发现过期就立刻删除这个key。定期删除:Redis会将设置了过期时间的key放到一个独立的字典中,并对该字典进行每秒10次的过期扫描,过期扫描不会遍历字典中所有的key,而是采用了一种简单的贪心策略。该策略的删除逻辑如下:从过期字典中随机选择20个key;原创 2022-10-28 21:43:45 · 1547 阅读 · 0 评论 -
场景应用:Redis 单线程模型
2、一个客户端的指令队列中的指令是顺序执行的;如上图中,执行完 client-0 的队列中的 command-0 后,然后执行哪个队列中的第一个指令是不确定的,但可以肯定的是不会有两个指令同时执行。其中,执行命令阶段,因Redis是单线程处理命令,于是每一条到达redis服务端的命令不会立刻执行,而是所有命令都进入一个队列中,然后逐个被执行。多个请求端发送来的命令的执行顺序是不确定的,但可以确定的是不会有两条命令被同时执行,也就是不会产生并发问题,以上便是Redis的单线程基本模型。原创 2022-10-17 17:35:04 · 1152 阅读 · 0 评论 -
场景应用:如何解决Redis主从同步中出现的问题?
那么对于客户端,当客户端发现 master 不可写后,我们可以采取降级措施,将数据暂时写入本地缓存和磁盘中,在一段时间(等 master 恢复正常)后重新写入 master 来保证数据不丢失,也可以将数据写入 kafka 消息队列,等 master 恢复正常,再隔一段时间去消费 kafka 中的数据,让将数据重新写入 master。一开始,主节点挂了 ,从节点是无法自动升级为主节点的,这个过程需要人工处理,在此期间 Redis 无法对外提供写操作。,表示一旦所有的从节点数据复制和同步的延迟都超过了。原创 2022-10-29 13:36:53 · 2180 阅读 · 0 评论 -
场景应用:id全局唯一且自增,如何实现?
改进后的架构保证了可用性但数据库的写压力依然很大,每次生成ID都要访问数据库,而且丧失了ID生成的“绝对递增性”:先访问DB 01生成0,3,再访问DB 02生成1,可能导致在非常短的时间内,ID生成不是绝对递增的(这个问题不大,目标是趋势递增,不是绝对递增)UUID的标准形式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种方式生成UUID。...原创 2022-08-29 11:24:54 · 2758 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)从入门到出土
布隆过滤器可以 100% 判断元素不在集合中,但是当元素在集合中时可能存在误判,因为当元素非常多时散列函数产生的 k 位点可能会重复(这里有公式推导,我没看懂,我不解释了)。可以通过定时重建的方式清除脏数据。如果这几个位置中,所有位置的值都是1,就说明这个布隆过滤器中,极有可能存在这个key。添加key时,每个哈希函数都利用这个key计算出一个哈希值,再根据哈希值计算一个位置,并将位数组中这个位置的值设置为1。如果这几个位置中,有一个位置的值是0,就说明这个布隆过滤器中,不存在这个key。...原创 2022-08-29 10:53:28 · 1479 阅读 · 0 评论 -
场景应用:如何保证缓存与数据库的双写一致性?
而在主从数据库同步之前,可能会有进程B访问了缓存,发现数据不存在,进而它去访问从库获取到旧的数据,然后同步到缓存。这个问题的解决方案,依然是采用延时双删的策略,但是在评估延长时间的时候,要考虑到主从数据库同步的时间。但进程B在这个过程里读到了旧的数据,可能还有其他进程也像进程B一样,在这两步之间读到了缓存中旧的数据,但因为这两步的执行速度会比较快,所以影响不大。最终,缓存和数据库的数据是一致的,但B拿到的仍然是旧的数据。可见,进程A的两步操作均成功,但由于存在并发,在这两步之间,进程B访问了缓存。...原创 2022-08-29 10:30:23 · 2021 阅读 · 0 评论 -
场景应用:Redis使用setnx命令实现分布式锁
而setnx命令和设置过期时间的命令不是原子的,可能加锁成功而设置过期时间失败,依然存在死锁的隐患。对于这种情况,Redis改进了set命令,给它增加了nx选项,启用该选项时set命令的效果就会setnx一样了。它的潜在问题如下图所示,如果进程A在主节点上加锁成功,然后这个主节点宕机了,则从节点将会晋升为主节点。若此时进程B在新的主节点上加锁成果,之后原主节点重启,成为了从节点,系统中将同时出现两把锁,这是违背锁的唯一性原则的。但是,它的锁早已自动释放过了,它此时释放的可能是其他线程的锁。...转载 2022-08-29 09:06:50 · 1443 阅读 · 0 评论 -
场景应用:缓存穿透、缓存击穿、缓存雪崩有什么区别,该如何解决?
今日单词:policy:策略。原创 2022-08-29 08:35:25 · 1475 阅读 · 0 评论 -
场景应用:利用Redis实现分布式Session
当客户端收到这个cookie之后,就会自动保存这个SESSIONID,并且在下次访问时自动携带这个SESSIONID,届时服务器就可以通过这个SESSIONID得到与之对应的session,从而识别用户的身。如果客户端再次访问服务器,请求被分发到服务器B上,则由于服务器B中没有这个session,所以用户的身份无法得到验证,从而产生了不一致的问题。把相关信息放到session中。第二是验证令牌的程序,就是在用户再次访问服务器时,我们获取到了它之前的身份标识,那么我们就要验证一下这个标识是否存在了。.....原创 2022-08-28 23:15:39 · 2952 阅读 · 0 评论 -
Redis:Sorted Set类型底层数据结构剖析
跳跃表在查找时,优先从高层开始查找,若next节点值大于目标值,或next指针指向NULL,则从当前节点下降一层继续向后查找,这样便可以提高查找的效率了。将字典的ht[1]哈希表晋升为默认哈希表,迁移完成后,清空ht[0],再交换ht[0]和ht[1]的值,为下一次REHASH做准备。将存储在ht[0]中的数据迁移到ht[1]上,重新计算键的哈希值和索引值,然后将键值对放置到ht[1]哈希表的指定位置上。如果执行的是扩展操作,则ht[1]的大小为第1个大于等于ht[0].used*2=n的2。...原创 2022-08-28 18:21:24 · 2137 阅读 · 0 评论 -
Redis:hash类型底层数据结构剖析
将字典的ht[1]哈希表晋升为默认哈希表,迁移完成后,清空ht[0],再交换ht[0]和ht[1]的值,为下一次REHASH做准备。h[0]的大小为4,那么2 * 4 = 8 ( 第一个大于等于8的 2的n次方是2 ^ 3 ) ,所以 h[1]大小设置为8。将存储在ht[0]中的数据迁移到ht[1]上,重新计算键的哈希值和索引值,然后将键值对放置到ht[1]哈希表的指定位置上。,所以ht[1]大小是16)。如果执行的是扩展操作,则ht[1]的大小为第1个大于等于ht[0].used*2=n的2。..原创 2022-08-28 18:00:03 · 2643 阅读 · 0 评论 -
Redis 数据结构原理及其应用场景大解析
跳表:先查第一层找到7 发现 7 的右边是null了,再从7 查第二层,右边是 37 比22 大,再从7下一层,下一个元素是19 ,19小于22,19的下一个是37,还得下一层,下一层的下一个就是22了,找到了。在数据量较小时,采用 ziplist 作为其编码,按 score 有序,当键或值长度过大(64)或个数过多(128)时,转为 skiplist + hashtable 编码,同时采用的理由是。存储数据,设计目标是让数据存储更紧凑,减少碎片开销,节约内存,它的结构如下。...原创 2022-08-28 08:59:38 · 1973 阅读 · 0 评论 -
Redis的高可用实现方案:哨兵与集群
高可用 这个词一般出现于分布式系统,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统在一年中,停机时间总共为 8.76个小时。......原创 2022-08-27 20:16:02 · 2487 阅读 · 0 评论 -
Lua 解决 Redis 缓存原子性问题
redis的缺点主要体现在并不支持完整的ACID事务,redis虽然提供事务功能,但redis的事务和关系数据库的事务不可相类比,redis的事务只能保证隔离性和⼀致性,无法保证原子性与持久性。此时,如果其他客户端修改了 a 和 b 的值,那么 exec 就会返回 nil,并不会执行两条 set 命令,此时客户端可以进行重试。而对于原子性来说:在Redis中单条命令是原子性,这是由 redis 单线程保障的,但是多条命令能否用。,因为读的结果并不能赋值给临时变量,用于后续的写操作,既然。......原创 2022-08-27 19:17:09 · 1246 阅读 · 0 评论 -
数据库的锁——代码实战篇
DML 主要目的是加行锁,为了让表锁不用检查每行数据是否加锁,加意向锁(表级)来减少表锁的判断,意向锁之间不会互斥。参数来完成不加锁的一致性备份(仅针对 InnoDB 引擎的表)如果不加任何包含,数据备份时就可能产生不一致的情况,如下图所示。查看元数据锁(适用于 MySQL 8.0 以上版本)查看意向表锁(适用于 MySQL 8.0 以上版本)缺点:粒度较粗,在 InnoDB 引擎很少使用。,DML 的元数据锁之间不互斥。用作全量备份时,保证。加元数据锁的几种情况。加意向表锁的几种情况。...原创 2022-08-27 11:10:30 · 1476 阅读 · 0 评论 -
MySQL中的日志(redo log、undo log、binlog)
提供再写入的操作,回复提交事务修改页的操作,用来保证事务持久性,假如说发生宕机,可以进行恢复数据,保证持久性。redo存放在重做日志文件中,与redo不同,undo存放在数据库内部的一个特殊段(segment)中,这个段称为undo段(undo segment),undo段位于共享表空间内。2、通用查询:日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。而undo log是需要进行随机读写的。...原创 2022-08-27 10:53:16 · 1740 阅读 · 1 评论 -
场景应用:MySQL一条查询语句执行流程
从上图可以看出,MySQL主要分为Server 层和存储引擎层两部分,其中Server 层主要包括连接器、查询缓存、分析器、优化器、执行器等,他们涵盖了 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等;c. 当缓存没有获取到结果时SQL语句就会向下执行来到分析器,分析器对SQL语句进行词法和语法分析,通过分析select可以知道该语句是查询语句,要查询的表为table表,字段为ID;...原创 2022-08-27 10:37:46 · 1411 阅读 · 0 评论 -
Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)
由于 redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率)。redis持久化是指在指定的时间间隔内将内存中的数据集快照(snapshotting)写入磁盘,恢复时是将快照文件读入内存,用来保证数据的持久性。通过使用RDB-AOF混合持久化,用户可以同时获得RDB持久化和AOF持久化的优点,”配置项开启AOF混合持久化。...原创 2022-08-27 10:12:38 · 1579 阅读 · 2 评论 -
Redis 数据结构操作相关命令
实战操作:把数据库中用户表中id为1的用户信息存到redis中,给hash中的key值单个设置值和单个key中的字段来获取。注:flushdb 还是flushall 两个尽量不要用,知道就行,在开发时,可以用一用,上线一定不要用。注: 默认从左开始向右获取指定索引的值,从右开始负数开始,-1就是右边第1个元素。类似于PHP中的索引数组,列表中的值是可以重复的。和set一样有序集合,元素不允许重复,不同的是每个元素都会关联一个分值。移除列表的最后一个元素,并将该元素添加到另一个列表并返回。...原创 2022-08-27 09:28:27 · 1334 阅读 · 0 评论 -
jdbc:mysql:///是什么
ssm_project原创 2022-08-26 21:07:43 · 2350 阅读 · 0 评论 -
MySQL命中索引代码实验案例
根据查询条件查询 1,2 都会先走二级索引,但是二级索引仅包含了 (province, city, county) 和 id 信息。我们现在用的是 5.6 以上版本,所以没有体会,可以用下面的语句关闭索引下推优化,再测试一下性能。修改 MySQL 配置文件,在 [mysqld] 下添加。准备大量数据:数据行数 100 万条,列个数 15 列。重启 MySQL 服务器,让选项生效。若建立组合索引 (a,b,c),则可以。若建立组合索引 (a,b,c),则可以。执行 db.sql 内的脚本,建表。原创 2022-10-31 19:05:45 · 1087 阅读 · 0 评论 -
MySQL主从同步原理
主从同步允许您将数据从一个数据库服务器复制到另一个数据库服务器。复制数据时,一个服务器作为主服务器(master ),其余的服务器作为从服务器(slave)。复制(replication)是MySQL数据库提供的一种高可用高性能的解决方案,一般用来建立大型的应用。并且复制是异步进行的,从服务器不需要总是连接到主服务器,从服务器也可以通过拨号间歇地连接到主服务器。配置文件允许您指定所有数据库、数据库甚至数据库上的表的复制。原创 2022-08-24 13:42:05 · 1405 阅读 · 0 评论 -
MySQL引擎:InnoDB VS MyISAM
在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。InnoDB不创建目录,使用InnoDB时,MySQL将在数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6B的ROWID,并以此作为主键。其中,最常用的引擎是InnoDB和MyISAM。原创 2022-08-24 09:45:31 · 1473 阅读 · 0 评论 -
MySQL中的explain解析
使用EXTENED关键字,EXPLAIN语句将产生附加信息。执行该语句,可以分析EXPLAIN后面SELECT语句的执行情况,并且能够分析出所查询表的一些特征。原创 2022-08-24 09:05:51 · 1711 阅读 · 0 评论 -
关于数据库优化你知道多少?
MySQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。通过优化文件系统,提高磁盘I\O的读写速度;通过优化操作系统调度策略,提高MySQL在高负荷情况下的负载能力;优化表结构、索引、查询语句等使查询响应更快;针对查询,我们可以通过使用索引、使用连接代替子查询的方式来提高查询速度。针对慢查询,我们可以通过分析慢查询日志,来发现引起慢查询的原因,从而有针对性的进行优化。原创 2022-08-24 07:52:35 · 1631 阅读 · 0 评论 -
数据库的锁——思想概念篇
锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。下面我们以MySQL数据库的InnoDB引擎为例,来说明锁的一些特点。InnoDB存储引擎实现了如下两种标准的行级锁:下图显示了共享锁和排他锁的兼容性,可以发现X锁与任何的锁都不兼容,而S锁仅和S锁兼容。InnoDB存储引擎支持多粒度锁定,这种锁定允许事务在行级上的锁和表级上的锁同时存在。为了支持在不同粒度上进行加锁操作,InnoDB存储引擎支持一种额外的锁方式,称之为意向锁。意向锁是将锁定的对象分为多个层次,意向锁意味着事务原创 2022-08-24 07:52:26 · 1392 阅读 · 0 评论 -
BTree vs B+Tree 节点操作流程图解
将这个叶子结点分裂成左右两个叶子结点,左叶子结点包含前 m/2 个(2个)记录,右结点包含剩下的记录,将中间的 key 进位到父结点中。即兄弟结点 key 有富余( > m/2 – 1 ),向兄弟结点借一个记录,同时替换父节点,例如删除 15。即兄弟节点合并成一个新的叶子结点,并删除父结点中的key,将当前结点指向父结点,例如删除 7。分裂成两个结点,左结点 2 个记录,右结点 3 个记录,key 16 进位到父结点中。,父结点 key 下移,兄弟结点 key 上移,删除结束,否则执行 3。原创 2022-08-23 20:33:53 · 1550 阅读 · 0 评论 -
数据库事务——快照读与当前读
选项,快照就会在事务启动时建立,以后的查询都基于此快照,因此 tx1 中第二次 select 仍然得到 1 号账户余额为 1000。这里的快照一旦建立,以后的查询都基于此快照,因此 tx1 中第二次 select 仍然得到 1 号账户余额为 1000。快照读主要体现在 select 时,而不同隔离级别下,select 的行为不同。在 RC(读提交) 隔离级别下 - 每次 select 都会建立新的快照。tx1 内的修改必须重新建立快照,否则,就会发生丢失更新的问题。如果希望事务启动时就建立快照,可以添加。原创 2022-08-23 20:19:36 · 1643 阅读 · 0 评论 -
数据库事务——事务隔离级别
但是与标准SQL不同的是,InnoDB存储引擎在REPEATABLE READ事务隔离级别下,使用Next-Key Lock的锁算法,因此避免了幻读的产生。有一个顶层事务控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务,它控制每一个局部的变换。MySQL的InnoDB引擎,在默认的REPEATABLE READ的隔离级别下,实现了可重复读,同时也解决了幻读问题。脏读与不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。,这种现象称为不可重复读。原创 2022-08-23 19:52:14 · 1239 阅读 · 0 评论 -
数据库事务——事务的特性(ACID)
Buffer Pool的使用大大提高了读写数据的效率,但是也带了新的问题:如果MySQL宕机,而此时Buffer Pool中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。:除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态,这是因为可能某些事务在执行过程中出现的错误并不会对所有的操作都无效,放弃整个事务不合乎要求,开销也太大。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。原创 2022-08-23 16:14:37 · 1944 阅读 · 0 评论