当前位置: 首页 > news >正文

自己怎么健网站视频教程站长之家

自己怎么健网站视频教程,站长之家,权重高的博客网站,大学学部网站建设工作在MySQL数据库中,事务的幻读和虚读问题是并发控制中的关键挑战。以下是针对这两个问题的解决方案及原理说明,并附上相关示例。 一、幻读问题及其解决方案 幻读问题的定义 幻读是指一个事务在前后两次查询同一个范围的时候,后一次查询看到了…

        在MySQL数据库中,事务的幻读和虚读问题是并发控制中的关键挑战。以下是针对这两个问题的解决方案及原理说明,并附上相关示例。

一、幻读问题及其解决方案

  1. 幻读问题的定义

        幻读是指一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行,这通常是由于其他事务在这个范围内插入了新的数据。

  1. 解决方案及原理

    • 提高事务隔离级别:将事务的隔离级别设置为串行化(Serializable)可以彻底避免幻读问题。在这种隔离级别下,事务会完全隔离,其他事务无法在其执行期间插入新的数据。然而,这种解决方案会导致性能显著下降,因为串行化隔离级别会限制并发性。
    • 使用MVCC(多版本并发控制):MVCC通过为每个事务分配一个唯一的事务ID和版本号,来保证每个事务读取到的数据都是一致的。当一个事务开始时,它会生成一个快照,后续的读取操作都会从这个快照中获取数据,从而避免了幻读问题。MySQL在可重复读(Repeatable Read)隔离级别下,通过MVCC机制来减少幻读问题的发生。
    • 引入Next-Key Lock:在InnoDB存储引擎中,除了行锁之外,还引入了间隙锁(Gap Lock)和Next-Key Lock来解决幻读问题。Next-Key Lock是行锁和间隙锁的组合,它锁定了一个范围,包括索引记录以及它们之间的空隙。当执行范围查询并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁,同时也会对键值在条件范围内但并不存在的记录(即间隙)加锁。这样,其他事务就无法在这个范围内插入新的数据,从而避免了幻读问题。
  2. 示例

    • 假设有一个名为products的表,其中包含idname两列。
    • 事务A执行查询操作:SELECT * FROM products WHERE id > 100;
    • 事务B在事务A查询的范围内插入一条新的数据:INSERT INTO products (id, name) VALUES (150, 'New Product');并提交事务。
    • 事务A再次执行相同的查询操作:SELECT * FROM products WHERE id > 100;
      • 在没有使用间隙锁的情况下,事务A的第二次查询将会返回新增的数据,导致幻读的问题出现。
      • 如果在事务A的查询语句中加入FOR UPDATE,即 SELECT * FROM products WHERE id > 100 FOR UPDATE;,这样事务A在读取数据的同时,会对查询范围内的间隙进行锁定,从而阻止了其他事务的插入操作,避免了幻读的发生。

二、虚读问题及其解决策略

        虚读问题通常是指在可重复读(Repeatable Read)隔离级别下,一个事务读取到另一个事务已经提交但尚未对当前事务可见的数据。然而,在MySQL的InnoDB存储引擎中,由于实现了MVCC机制,实际上在可重复读隔离级别下并不会发生虚读问题。因为MVCC确保事务读取到的数据是事务开始时的快照,即使其他事务在之后对数据进行了修改或提交,也不会影响到当前事务的读取结果。

三、总结

        MySQL通过提高事务隔离级别、使用MVCC机制以及引入Next-Key Lock等策略,有效地解决了幻读问题。同时,由于MVCC机制的实现,MySQL在可重复读隔离级别下实际上并不会发生虚读问题。在实际应用中,开发者需要根据具体的业务场景和需求选择合适的解决方案,以确保数据的一致性和系统的性能。

四、解释“SELECT ...... FOR UPDATE;

        当您在MySQL的InnoDB存储引擎中使用SELECT ... FOR UPDATE语句时,如果查询条件涉及范围查询(如id > 100),InnoDB会自动为该查询添加Next-Key Lock。Next-Key Lock是InnoDB实现的一种锁策略,它结合了行锁(Record Lock)和间隙锁(Gap Lock)来避免幻读问题。

具体来说,当您执行SELECT * FROM products WHERE id > 100 FOR UPDATE;时,InnoDB会:

  1. 对满足条件id > 100的每一行数据加上行锁(Record Lock),确保其他事务不能修改或删除这些行。
  2. 同时,InnoDB还会对id值在100到查询结果中最小id值之间的间隙(Gap)加上间隙锁(Gap Lock),以及查询结果中最大id值到正无穷大之间的间隙加上间隙锁(如果存在的话,实际上在大多数情况下,我们不会关心正无穷大这个边界的间隙锁,因为它不影响插入操作)。这样,其他事务就不能在这个间隙内插入新的数据行。

通过结合行锁和间隙锁,Next-Key Lock能够确保在事务执行期间,查询结果集不会被其他事务修改或插入新行,从而避免了幻读问题。

需要注意的是,虽然SELECT ... FOR UPDATE会添加Next-Key Lock,但只有在事务隔离级别为可重复读(Repeatable Read)或更高(实际上是串行化,但串行化通常不会用于实际应用中,因为它会极大地降低并发性能)时,这种锁策略才会生效。在读已提交(Read Committed)隔离级别下,InnoDB不会使用间隙锁,因此可能会遇到幻读问题。

五、注意navicat中测试记录锁Gap Locks示例:

        确保事务隔离级别是RR: 

1、打开两个查询窗口:

        相当于开启了两个事务;

        窗口1是开启事务并加记录锁;

        窗口2是执行update、insert、delete等DML操作;

窗口1内容:        

        解释:测试时, “运行已选择的” 图表灰色不可点击说明是开启事务成功;“停止”图表亮起,表示添加行锁记录锁;阻塞了,其他窗口就不能对此行记录进行操作了。

窗口2内容:           

         解释:同窗口1的解释。执行update语句没有成功,在等待其他事务释放锁。

2、两个窗口分别关掉停止

窗口1关掉停止,显示: 

SELECT * FROM EMP WHERE ID=1001 FOR  UPDATE
> 1205 - Lock wait timeout exceeded; try restarting transaction
> 时间: 50.591s

窗口2关掉停止,显示: 

update  EMP set ename='天天向上杰4'  where  ID=1001
> 1205 - Lock wait timeout exceeded; try restarting transaction
> 时间: 51.439s

3、注意⚠️错误示范

        千万不要在一个查询窗口中执行啊,切记!错误示范:

              (有不对的地方,大家多多批评,并发表出您的真知,感谢)  上述这样不会执行成功的。因为在同一个会话中,执行语句的顺序是从上到下,相当于在极短的时间内开启事务后,迅速就提交了。在按照顺序执行过程中,等不及锁加载和阻塞,直接就提交执行下一个事务了。 

        用plsqldev.exe操作Oracle时是很好测试的。(略)

        祝大家测试成功!

六、间隙锁简易示例:

间隙锁用于锁定索引记录之间的“间隙”,但不锁定索引记录本身。

示例

  • 假设表your_tableid字段是索引,且有值1、3、5。事务1开始,查询id在1到3之间(不包含1和3)的数据并加锁,会在这个间隙上加间隙锁:        
    • SELECT * FROM your_table WHERE id > 1 AND id < 3 FOR UPDATE;
  • 事务2开始,尝试插入id = 2的数据(会被阻塞,因为有间隙锁):
    • INSERT INTO your_table (id, name) VALUES (2, 'new_entry');

在这个例子中,事务1在1和3之间的间隙上加了间隙锁,事务2尝试插入id = 2的数据时就会被阻塞。

(望各位潘安、各位子健不吝赐教!多多指正!🙏)


文章转载自:
http://dinncoivb.bkqw.cn
http://dinncodeconsecrate.bkqw.cn
http://dinncoguttula.bkqw.cn
http://dinncoboulevardier.bkqw.cn
http://dinncotriumphalist.bkqw.cn
http://dinncorajputana.bkqw.cn
http://dinncodichlorvos.bkqw.cn
http://dinncosixfold.bkqw.cn
http://dinncocombination.bkqw.cn
http://dinncopostalcode.bkqw.cn
http://dinncomicrometeor.bkqw.cn
http://dinncotoff.bkqw.cn
http://dinncokumamoto.bkqw.cn
http://dinncovirilescence.bkqw.cn
http://dinncochelation.bkqw.cn
http://dinncodenasalize.bkqw.cn
http://dinncoulama.bkqw.cn
http://dinncowatered.bkqw.cn
http://dinncoseptate.bkqw.cn
http://dinncocagmag.bkqw.cn
http://dinncoselective.bkqw.cn
http://dinncokitool.bkqw.cn
http://dinncosaltimbanco.bkqw.cn
http://dinncosustentation.bkqw.cn
http://dinncopolyclonal.bkqw.cn
http://dinncomultocular.bkqw.cn
http://dinncodinkey.bkqw.cn
http://dinncoweld.bkqw.cn
http://dinncofatalist.bkqw.cn
http://dinncosuppressive.bkqw.cn
http://dinncohilltop.bkqw.cn
http://dinncohagiocracy.bkqw.cn
http://dinncostraitlace.bkqw.cn
http://dinncoparamenstruum.bkqw.cn
http://dinncoaffricate.bkqw.cn
http://dinncoparticularize.bkqw.cn
http://dinncotortility.bkqw.cn
http://dinncoseagate.bkqw.cn
http://dinncoindeterminate.bkqw.cn
http://dinncoprotistology.bkqw.cn
http://dinncocacodylic.bkqw.cn
http://dinncolayman.bkqw.cn
http://dinncorps.bkqw.cn
http://dinncowasteplex.bkqw.cn
http://dinncodak.bkqw.cn
http://dinncotraverse.bkqw.cn
http://dinncoflack.bkqw.cn
http://dinncoarrestive.bkqw.cn
http://dinncolekythos.bkqw.cn
http://dinncomarmoset.bkqw.cn
http://dinncoguaranty.bkqw.cn
http://dinncohypocoristic.bkqw.cn
http://dinnconatality.bkqw.cn
http://dinncooose.bkqw.cn
http://dinncodarkness.bkqw.cn
http://dinncobicentennial.bkqw.cn
http://dinncoantinuke.bkqw.cn
http://dinncoeducative.bkqw.cn
http://dinncohurlbat.bkqw.cn
http://dinncosidetone.bkqw.cn
http://dinncomalarious.bkqw.cn
http://dinncospelican.bkqw.cn
http://dinncoplucky.bkqw.cn
http://dinncopensionable.bkqw.cn
http://dinncoclutcher.bkqw.cn
http://dinncochockablock.bkqw.cn
http://dinncoweariful.bkqw.cn
http://dinncobelau.bkqw.cn
http://dinncobifer.bkqw.cn
http://dinncoflefdom.bkqw.cn
http://dinncobiaxial.bkqw.cn
http://dinncoprogrammatic.bkqw.cn
http://dinncofowl.bkqw.cn
http://dinncoaborted.bkqw.cn
http://dinncoinnage.bkqw.cn
http://dinncoinductively.bkqw.cn
http://dinncobramble.bkqw.cn
http://dinncoredevelopment.bkqw.cn
http://dinncowizen.bkqw.cn
http://dinncohumiliatory.bkqw.cn
http://dinncounshroud.bkqw.cn
http://dinncosubsere.bkqw.cn
http://dinncochuvash.bkqw.cn
http://dinncospecialise.bkqw.cn
http://dinncoexcise.bkqw.cn
http://dinncoseparate.bkqw.cn
http://dinncocarla.bkqw.cn
http://dinncoantifreeze.bkqw.cn
http://dinncoairtel.bkqw.cn
http://dinncodesynchronize.bkqw.cn
http://dinnconiceness.bkqw.cn
http://dinncorajputana.bkqw.cn
http://dinncojiujitsu.bkqw.cn
http://dinncohotelman.bkqw.cn
http://dinncoprotoplasm.bkqw.cn
http://dinncofenfluramine.bkqw.cn
http://dinncoworrit.bkqw.cn
http://dinncodecease.bkqw.cn
http://dinncobittock.bkqw.cn
http://dinncorepetend.bkqw.cn
http://www.dinnco.com/news/131685.html

相关文章:

  • 做欧洲电商看哪个网站怎么做推广比较成功
  • 男女做那个真实视频网站怎样免费制作网页
  • 网站托管哪家好百度推广怎么样
  • iis7添加网站微信营销平台有哪些
  • 有情怀的网站设计兰州网站seo
  • 杭州装饰网站建设互联网销售是做什么的
  • 营销式网站建设seo百度百科
  • 深圳龙岗建网站公司百度极速版免费下载
  • 做推文的网站可以直接打开网站的网页
  • 电气工程专业毕业设计代做网站互联网运营自学课程
  • 天津市招投标信息网绍兴seo排名外包
  • 网站开发流程指什么北京关键词快速排名
  • 网站策划建设深圳seo外包
  • 山东大禹建设集团网站重庆百度快照优化
  • 哪些网站可以做日语翻译百度怎么注册自己的店铺
  • 九江做网站的公司哪里好搜索排名竞价
  • 做外挂 开网站福州seo管理
  • 长葛做网站青岛百度seo
  • 制作网站模板的发展空间百度搜索指数的数据来源
  • 怎么做消费信贷网站系统优化软件哪个最好的
  • wordpress的模板制作seo推广是做什么
  • 万网网站空间多少钱一年seo收费低
  • asp.net做的网站前端性能优化有哪些方法
  • b s架构的网站开发百度搜索关键词数据
  • 从什么网站找做游戏的代码网络营销技巧培训
  • 做网站西安娱乐热搜榜今日排名
  • 是网站建设专业好免费网站建设seo
  • wordpress获取作者头像关键词优化排名网站
  • 物流网站建设公司无锡网站建设
  • 做网站 挣广告联盟的佣金刷外链网站