mysql中RR与幻读的问题解决方法
发布时间:2023-09-28 09:58:29 所属栏目:MySql教程 来源:
导读:这篇“mysql中RR与幻读的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看
这篇“mysql中RR与幻读的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql中RR与幻读的问题怎么解决”文章吧。 读未提交:能读到一个事务的中间过程,违背了 ACID 特性,存在脏读的问题,基本不会用到。 读提交:表示如果其他事务已经提交,那么就可以看到。在生产环境中用的并不多。 可重复读:默认级别,使用最多的一种。其特点是有 Gap 锁(间隙锁)。 可串行化:所有的实现都是通过锁来实现的。 并发事务处理也会带来一些问题:脏读、不可重复读、幻读 脏读:一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态。 不可重复读:一个事务按相同查询条件前后两次读取,读出的数据不一致(修改、删除)。 幻读:一个事务内按相同的查询条件重新查询数据,却发现其他事务插入了满足其查询条件的新数据。 本文脉络梳理: RR 为了更快并发,引入 MVCC,但有幻读的可能,为解决幻读,引入 Gap 锁,Gap 可能造成死锁。 MVCC 原理 MVCC(多版本控制): 指数据库中为了实现高并发的数据访问,对数据进行多版本处理,并通过事务的可见性来保证事务能看到自己应该看到的数据版本。 MVCC 最大的好处是读不加锁,读写不冲突。 在 OLTP (On-Line Transaction Processing)应用中,读写不冲突很重要,几乎所有 RDBMS 都支持 MVCC。 (1)MVCC 多版本实现 MySQL 实现 MVCC 机制的时候,是基于 undo log 多版本链条 + ReadView 机制。 undo log 多版本链: 每一次对数据库的修改,都会在 undo log 日志中记录当前修改记录的事务号及修改前数据状态的存储地址(即 ROLL_PTR),以便在必要的时候可以回滚到老的数据版本。 ReadView 机制: 在多版链的基础上,控制事务读取的可见性。 RC读提交: 每一条读操作语句都会获取一次 ReadView,每次更新之后,都会获取数据库中最新的事务提交状态,也就可以看到最新提交的事务了,即每条语句执行都会更新其可见性视图。 RR可重复读: 开启事务时不会获取 ReadView,只有发起第一个快照读时才会获取 ReadView。 (2)快照读与当前读 在 MVCC 并发控制中,读操作 可以分为两类: 快照读:读取的是记录的可见版本(有可能是历史版本), 不用加锁 。 操作:简单的 SELECT 操作。 当前读:读取的是记录的最新版本,并且当前读返回的记录,都会加锁,保证其他事务不会再并发修改这条记录。 操作:特殊读操作、新增/更新/删除操作。 -- 对应 SQL 如下: -- 1. 特殊读操作 SELECT ... FOR UPDATE SELECT ... LOCK IN SHARE MODE -- 共享锁 -- 2. 新增:INSERT -- 3. 更新:UPDATE -- 4. 删除:DELETE 以上就是关于“mysql中RR与幻读的问题怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |