推广

面试官问你:MySQL事务和隔离级别,你该如何回答

iseeyu2年前 (2024-02-21)推广207

这几个特性不是一种平级关系:

  • 只有满足一致性,事务的执行结果才是正确的。
  • 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时要只要能满足原子性,就一定能满足一致性。
  • 在并发的情况下,多个事务并发执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
  • 事务满足持久化是为了能应对数据库奔溃的情况。

二、并发一致性

Ⅰ、更新丢失(Lost Update)

T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。

例如,两个程序员修改同一java文件。每程序员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖前一个程序员所做的更改。

如果在一个程序员完成并提交事务之前,另一个程序员不能访问同一文件,则可避免此问题。

Ⅱ、脏读

一句话:事务B读取到了事务A已修改但尚未提交的的数据,还在这个数据基础上做了操作。此时,如果A事务回滚Rollback,B读取的数据无效,不符合一致性要求。

解决办法: 把数据库的事务隔离级别调整到 READ_COMMITTED

T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。

Ⅲ、不可重复读(Non-Repeatable Reads)

在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

一句话:一个事务范围内两个相同的查询却返回了不同数据。

同时操作,事务1分别读取事务2操作时和提交后的数据,读取的记录内容不一致。不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。

解决办法: 如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。把数据库的事务隔离级别调整到REPEATABLE_READ

T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

Ⅳ、幻读

一个事务T1按相同的查询条件重新读取以前检索过的数据,却发现其他事务T2插入了满足其查询条件的新数据,这种现象就称为“幻读”。(和可重复读类似,但是事务 T2 的数据操作仅仅是插入和删除,不是修改数据,读取的记录数量前后不一致)

一句话:事务A 读取到了事务B提交的新增数据,不符合隔离性。

解决办法: 如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。把数据库的事务隔离级别调整到 SERIALIZABLE_READ。

T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

三、事务隔离级别

“脏读”、”不可重复读”和”幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上 “串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。

MYSQL常看当前数据库的事务隔离级别:show variables like 'tx_isolation';

Ⅰ、读未提交 (Read Uncommitted)

最低的隔离等级,允许其他事务看到没有提交的数据,会导致脏读。

Ⅱ、读已提交 (Read Committed)

被读取的数据可以被其他事务修改,这样可能导致不可重复读。也就是说,事务读取的时候获取读锁,但是在读完之后立即释放(不需要等事务结束),而写锁则是事务提交之后才释放,释放读锁之后,就可能被其他事务修改数据。该等级也是 SQL Server 默认的隔离等级。

Ⅲ、可重复读(Repeatable Read)

所有被 Select 获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,即前一个事务有读锁但是没有范围锁,为什么叫做可重复读等级呢?那是因为该等级解决了下面的不可重复读问题。(引申:现在主流数据库都使用 MVCC 并发控制,使用之后RR(可重复读)隔离级别下是不会出现幻读的现象。)

MYSQL默认是REPEATABLE-READ

Ⅳ、串行化(Serializable)

所有事务一个接着一个的执行,这样可以避免幻读 (phantom read),对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询的时候,需要获取范围锁,如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需回滚该事务。

Ⅴ、总结

  • 读未提交: 一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交: 一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读 : 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 串行化: 顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

四个级别逐渐增强,每个级别解决一个问题,事务级别越高,性能越差,大多数环境(Read committed 就可以用了)

隔离级别 读数据一致性 脏读 不可重复读 幻影读
未提交读 最低级别
提交读 语句级 ×
可重复读 事务级 × ×
可串行读 最高级别,事务级 × × ×

慕容千语:专注于Java开发技术的研究与知识分享!

————END————

  • 点赞(编辑不易,感谢您的支持)

  • 转发(分享知识,传播快乐)

  • 关注(每天更新Java开发技术)

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57556.html

相关文章

【资讯类网站优化】分享资讯类网站SEO优化技巧。

【资讯类网站优化】分享资讯类网站SEO优化技巧。

网站优化可以从狭义或者广义两个方面来说明,网站优化是对网站进行程序、域名注册查询、内容、版块、布局等多方面的优化调整,也就是网站设计时适合搜索引擎检索,满足搜索引擎排名的指标,从而在搜索引擎检索中获得流量排名靠前,增强搜索引擎营销的效果使网站的产品相关的关键词能有好的排位。指出网站优化使网站更容易被...

网站优化对于内部链接和外部链接有怎样的价值。

网站优化对于内部链接和外部链接有怎样的价值。

一、网站优化外部链接的价值,让搜索引擎发现我们的网站 而内部链接的价值是让曾经抵达我们网站的蜘蛛发现我们网站更多页面,进一步增加页面收录。搜索引擎的收录,实践上是十分依托内链的。搜索引擎顺着其他网站上的某个链接发现我们网站,然后剖析我们网站页面的链接,再从一个内部链接匍匐到另一个内部链接,剖析得出...

小编教你你知道哪种推广渠道。

小编教你你知道哪种推广渠道。

你知道哪种推广?什么叫推广渠道? 推广渠道从字面上理解来说就是有多少种方法和渠道能把自己的推送给用户。 推广的渠道有千千万万种,但是你真的能确定是那个渠道给你带来有效的客户吗?举个例子来说,微信公众号推广,你写了一篇文章有5000次阅读1000次转发结果一个有效客户也没有 和 博客推广你写了一篇...

网站排名刷点击的方法是什么。

网站排名刷点击的方法是什么。

网站关键词排名刷点击流量中重要的内容,不要使用图片。 搜随便索引擎已经能对图片的内容进行简单的识别,绝大部分图片里的内容搜索引擎是无法识别的。对于导航或者网页中重要的位置,建议使用文字来描述,切勿使用图片。 合理利用ALT标签 alt标签指的是对图片的描述标签,简单来说就是我们...

强调说明网站使用静态HTML是提升搜索引擎与用户体验的主要手段。

强调说明网站使用静态HTML是提升搜索引擎与用户体验的主要手段。

主要是静态HTML页面,许多的动态网页不利于谷歌搜索。静态网页是相对于动态网页的,指那些没有后台数据库、程序和交互的网页,静态网页更新比较麻烦,适合显示更新较少的网站。我们上海网站建设公司通常采用特定的静态处理方式。很多朋友很容易误解静态页面是HTM页面。实际上,静态页面并不是完全静态的。它们还可以...

企业建营销网站要依据哪些条件。

企业建营销网站要依据哪些条件。

导读:如今手机网站建设公司是越来越多,网站一多对于想要做网站的人来说却不知道该如何去选择了,也就是说不知道找什么样的建站公司才是最靠谱的,有的企业会找相熟的朋友去做,有的人会去找在网站建设这个市场上最为专业的公司去制作网站,因为建设一个网站是一个 大的工程,所耗的时间也会长一点,那找营销型网站建设公...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片