mysql如何解决幻读(别再误解mysql的幻读了)
小爱今天给分享mysql如何解决幻读的知识,其中也会对别再误解mysql的幻读了进行解释,希望能解决你的问题,请看下面的文章阅读吧!
mysql如何解决幻读(别再误解mysql的幻读了)
mysql如何解决幻读(别再误解mysql的幻读了)
mysql如何解决幻读(别再误解mysql的幻读了)
mysql如何解决幻读(别再误解mysql的幻读了)
1、1,2,3(重复读:由于与上面的在一个事务中,所以只读到事务开始事务的数据,也就是重复读)我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题:| +------+-------+何为事务? 一言蔽之, 事务是逻辑上的一组作,要么都执行,要么都不执行。
2、| | id | value |事务最经典也经常被拿出来说例子就是转账了。
3、如小明要给小红转账 1000 元,这个转账会涉及到两个关键作,这两个作必须都成功或者都失败。
4、事务会把这两个作就可以看成逻辑上的一个整体,这个整体包含的作要么都成功,要么都要失败。
5、这样就不会出现小明余额减少而小红的余额却并没有增加的情况。
6、大多数情况下,我们在谈论事务的时候,如果没有特指 分布式事务 ,往往指的就是 数据库事务 。
7、数据库事务在我们日常开发中接触的最多了。
8、如果你的项目属于单体架构的话,你接触到的往往就是数据库事务了。
9、那数据库事务有什么作用呢?简单来说,数据库事务可以保证多个对数据库的作(也就是 SQL 语句)构成一个逻辑上的整体。
10、构成这个逻辑上的整体的这些数据库作遵循: 要么全部执行成功,要么全部不执行 。
11、另外,关系型数据库(例如: MySQL 、 SQL 、 Oracle 等)事务都有 ACID 特性:ACID这里要额外补充一点: 只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。
12、也就是说 A、I、D 是手段,C 是目的!在典型的应用程序中,多个事务并发运行,经常会作相同的数据来完成各自的任务(多个用户对同一数据进行作)。
13、并发虽然是必须的,但可能会导致以下的问题。
14、不可重复读和幻读区别 :不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次查询同一条查询语句(DQL)时,记录发现记录增多或减少了。
15、SQL 标准定义了四个隔离级别:隔离级别读不可重复读幻读 READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLEMySQL 的隔离级别基于锁和 MVCC 机制共同实现的。
16、SERIALIZABLE 隔离级别,是通过锁来实现的。
17、除了 SERIALIZABLE 隔离级别,其他的隔离级别都是基于 MVCC 实现。
18、不过, SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制,就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。
19、MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 。
20、我们可以通过 SELECT @@tx_isolation; 命令来查看,MySQL 8.0 该命令改为 SELECT @@transaction_isolation;从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。
21、但是!InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况:因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失。
22、InnoDB 存储引擎在分布式事务的情况下一般会用到 SERIALIZABLE 隔离级别。
本文到这结束,希望上面文章对大家有所帮助。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。