开始之前,先给大家简要的说几个名词:
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 可序列化 (串行化) | ✘ | ✘ | ✘ |
这就是小喵为大家,也是为自己做的一个小总结!
希望对大家有用!!
( ^ __ ^) ~!!