登录
首页 >  数据库 >  MySQL

MySql 隔离级别

来源:SegmentFault

时间:2023-01-27 20:48:02 331浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《MySql 隔离级别》,文章讲解的知识点主要包括MySQL,如果你对数据库方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

一、事务四个特性 ACID

事务模型是电子交易的保障,尤其是当今基于互联网的电子交易日益增长,对事务模型的依赖也更加重要
1、原子性 A
   事务是一个原子操作单元,在一个事物中的所有操作只有一个,要么操作成功或者要么操作失败,不存在第三种情况
2、一致性 C
   即数据从一种一致性的状态到另外一种一致性的状态,事务操作前与操作后必须满足业务规则的约束(例:账户A向账户B转账,转账后账户A与B的总和应该与之前是保持一致的,如果A向B转账A的账户没有少或者B的账户没有增加,我们认为此时的数据不是一致性状态)
3、隔离性 I
   隔离性是数据库允许多个并发事务同时对数据进行读写的能力,隔离性可以防止事务并发执行时由于交叉执行导致数据不一致的问题。
4、持久性 D
       事务完成后,对数据的修改是永久的,即使出现系统故障也不会丢失。

二、并发遇到的问题

1.更新丢失
当两个事务选择同一行,然后更新数据,由于每个事务都不知道其他事务的存在,就会发生丢失更新的问题,(你我同时读取同一行数据,进行修改,你commit之后我也commit,那么我的结果将会覆盖掉你的结果)。

2.脏读
一个事务正在对一条记录做修改,在这个事务提交之前,别的事务读取到了这个事务修改之后的数据,也就是说,一个事务读取到了其他事务还没有提交的数据,就叫做脏读。

3.不可重复读
一个事务读某条数据读两遍,读到的是不一样的数据,也就是说,一个事务在进行中读取到了其他事务对旧数据的修改结果,(比如说 我开一个事务 修改某条数据 先查后改 执行修改动作的时候发现这条数据已经被别的事务删掉了)

4.幻读
  一个事务中,读取到了其他事务新增的数据,仿佛出现了幻象。(幻读与不可重复读类似,不可重复读是读到了其他事务update/delete的结果,幻读是读到了其他事务insert的结果)

三、隔离级别

1.未提交读(read-uncommitted)
在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用。

2.已提交读(read-committed)
在一个事务中,可以读取到其他事务已经提交的数据变化,这种读取也就叫做不可重复读,因为两次同样的查询可能会得到不一样的结果。

3.可重复读(repetable-read)
MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。

4.可串行化(serializable)
这是最高的隔离级别,它强制事务串行执行,避免了前面说的幻读现象,简单来说,它会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用问题。

隔离级别一览表

隔离级别 读数据一致性 脏读 不可重复读 幻读
未提交读 最低级别,只保证不读取物理上损坏的数据
已提交读 语句级
可重复读 事务级
可串行化 最高级别

-- 查看当前数据库的隔离级别
SHOW VARIABLES LIKE "%tx_isolation%"

今天带大家了解了MySQL的相关知识,希望对你有所帮助;关于数据库的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表