MySQL的事务的基本特性和隔离级别MySQL事务的ACID靠什么保障

Posted Acmen-zym

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的事务的基本特性和隔离级别MySQL事务的ACID靠什么保障相关的知识,希望对你有一定的参考价值。

事务基本特性

原子性
原子性很好理解,就是指一个事务的操作要么全部成功,要么全部失败
一致性
举例来说,例如A转账100到B中,这个操作是需要从A的账户中减去100,B的账户中增加100。这个操作中如果如果A账户余额不足100了没有通过约束,次事务就不能成功。为了保证数据一致性,将会使用到原子性,让减少和增加这两个事务都失败。可以这样大概的理解,事务的原子性、隔离性、持久性就是用来保证一致性的
隔离性
隔离性是指一个事务这修改提交前,对其他事务的可见程度,根据事务隔离级别来进行分别
持久性
持久性就是指,事务一旦提交了,所修改的内容将可以保存到数据库中

事务隔离级别

read uncommit 读未提交
这个级别下的事务,是可以读到没有提交的数据的,也就是脏读。已下图为例,因为第二个事务是后出现的,也就是可以读取到事务一暂无提交的数据。最终因为事务一失败了,由于事务二可以读未提交,并且事务二成功了导致B账户中多了100。所以使用此隔离级别需要慎重选择
在这里插入图片描述

read commit 读已提交
读已提交也叫做不可重复读,这个隔离级别解决了读脏数据的问题,只会读取已提交的事务。但是会出现两次读的数据不一致的情况。已下图为例,如果事务三再事务二还没有提交前去读数据,那么事务三读到的也就是事务一的提交数据。随后事务二提交了,然后事务三再次读取时,就会读取事务二提交的数据。这个事务隔离级别是oracle的默认级别
在这里插入图片描述
repeatable read 可重复读
可重复读是指每次读到的数据都会是一样的,会以第一次读到的提交事务为准。已下图为例,事务三在进行第一次读时,事务二还没有提交,此时事务三读到的则是事务一提交的数据。这第二次读的时候事务二已经提交了,但是事务三会不做理会,而是继续去读事务一中的内容,每次读取都是同样的结果。但是在新增(insert)数据时会出现幻读,例如这进行范围查询例如大于小于,比如说第一次查询是3条数据,这执行insert之后第二次会出现4条数据,可以使用间隙锁来解决。可重复读是mysql的默认事务级别
在这里插入图片描述
serializable 串行
串行一般不会被使用,串行会给每一行读的数据加上锁,会导致大量的超时和锁的竞争可应用场景不多

ACID的保障

A原子性由undo log保证,这个日子记录了要回滚的日志信息,事务回滚时撤销已经执行成功的SQL
C一致性需要由其它三大特性保证与程序业务代码保证一致性,比如说余额90转账100这个肯定是不成立,这个肯定是不能通过的,所以需要业务代码中处理
I 隔离性由MVCC来保证,也就是事务列表(trx_sys->trx_list)创建一个副本(read view),具体要根据隔离基本判定
D持久性由内存+redo log来保证,mysql修改数据同时这内存中和redo log记录这次操作,如果mysql宕机了可以从redo log恢复,redo log的操作会在系统空闲时进行。下图是innoDB中redo log写盘简易过程
在这里插入图片描述

以上是关于MySQL的事务的基本特性和隔离级别MySQL事务的ACID靠什么保障的主要内容,如果未能解决你的问题,请参考以下文章

mysql的事务四个特性以及事务的四个隔离级别

Mysql的事务特性,四种隔离级别及原理

MySQL事务特性,隔离级别

MySQL高级 之 事务(ACID特性 与 隔离级别)

MySQL:事务四大特性与隔离级别

关于mysql事务的特性和隔离级别