Mysql事务ACID与隔离级别的总结
  TEZNKK3IfmPf 2023年11月14日 16 0

开始之前,先给大家简要的说几个名词:

A(atomicity)原子性:

  原子性是指一个事务是一个不可分割的工作单位,其中的操作要么全部做完,要么不做,不会出现只做一部分的情况.

    那如果无法保证原子性将会出现什么情况呢?

我们举个转账的案例,   A用户 要向 B用户 转1000万.                            

根据 原子性的意思来说的话就是,这次转账有两种结果,要么就转账成功,要么就转账失败,它是不会存在卡在中间的那种情况!

那如果无法保证原子性的话就会出现这样的情况: 

    A用户 向 B用户 转了1000万 , 那A用户账户现在没有那1000万了,而B用户的账户却没有增加那1000万,转账失败.系统将会无缘无故的丢失了1000万~~

C(consistency)一致性:

        一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的而不是语法上的。

I(isolation)隔离性:

     隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

        如果无法保证隔离性会怎么样?

举个例子

假设A账户有200元,B账户0元。A账户往B账户转账两次,金额为50元,分别在两个事务中执行。

 如果不保证隔离性,A扣款两次,而B只加款一次,凭空消失了50元,依然出现了数据不一致的情形!

D(durability)持久性:

  持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

    如果无法保证持久性会怎么样?

        在Mysql中,为了解决CPU和磁盘速度不一致问题,Mysql是将磁盘上的数据加载到内存,对内存进行操作,然后再回写磁盘。

    好,假设此时宕机了,在内存中修改的数据全部丢失了,持久性就无法保证。

设想一下,系统提示你转账成功。但是你发现金额没有发生任何改变,此时数据出现了不合法的数据状态,我们将这种状态认为是数据不一致的情形。

 

在说隔离级别之前,我们先说如下几个概念:

脏读

  一个事务对数据进行增删改,但并没有提交,但另一事务却能读到未提交的数据

不可重复读

  一事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致

幻读

  一事务对数据进行了新增操作,另一事务两次查询结果不一致。

 

        不可重复读主要体现在update与delete,而幻读主要体现在insert,从实现层面上讲,要解决不可重复读,我们只需要对查询的数据进行加锁就可以实现,此时update与delete这些行都会阻塞等待,但是insert依旧可以,避免不了幻读,而要解决幻读,必须对其行与行之前也加锁,在mysql中,是通过next key lock(行锁+gap lock)来实现的。

        

隔离级别:

read uncommited读未提交一个事务可以读取另一个未提交事务的数据。

  隔离级别为0,会有脏读,不可重复读,幻读

read commited 读已提交:一个事务要等另一个事务提交后才能读取数据 。  ( Oracle 的默认隔离级别是read commited )

  隔离级别为1,不会有脏读,但有不可重复读,幻读

repeatable read可重复读: 就是在开始读取数据(事务开启)时,不再允许修改操作.      ( Mysql的默认隔离级别是repeatable read )

  隔离级别为2,不会有脏读,不可重复读,但依旧会有幻读。

serializable可序列化(串行化):是最高的事务隔离级别,在该级别下,事务串行化顺序执行。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

  隔离级别为3,不会有脏读,不可重复读,幻读。但效率最低,并发性能最差,一般情况下不会使用。

  脏读   不可重复读    幻读      
read uncommited  读未提交   ✔    ✔   ✔
read commited    读已提交   ✘    ✔   ✔
repeatable  read   可重复读   ✘     ✘   ✔
serializable  可序列化 (串行化)   ✘     ✘    ✘

 

这就是小喵为大家,也是为自己做的一个小总结!

希望对大家有用!!

( ^ __ ^) ~!! 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   25   0   0 mysql
  TEZNKK3IfmPf   2024年05月17日   52   0   0 sqlmysql
  TEZNKK3IfmPf   2024年05月31日   31   0   0 数据库mysql
  TEZNKK3IfmPf   2024年05月17日   49   0   0 查询mysql索引
  TEZNKK3IfmPf   2024年05月17日   50   0   0 jsonmysql
  TEZNKK3IfmPf   2024年05月17日   49   0   0 mysqlphp
  TEZNKK3IfmPf   2024年05月31日   27   0   0 数据库mysql
TEZNKK3IfmPf