在技术面试中,面试官经常能够问到关于数据库事务相关的,通常数据库事务具备四大特性(ACID),
分别是:
- 原子性
- 一致性
- 隔离性
- 持久性
所谓原子性:是指事务是一个最小单元,不可再分隔,成为一个整体。
所谓一致性:是指事务中的方法要么同时成功,要么都不成功。比如A向B转账,要不都成功,要不都失败。
所谓隔离性:是指当多个事务操作数据库中同一个记录或多个记录时,对事务进行隔离开来有序执行,避免同时对同一数据做操作。这时候就需要使用锁来解决这个问题了(后面讲)。
所谓持久性:即当成功插入一条数据库记录时,数据库必须保证有一条数据永久的写入到数据库磁盘中。我们可以分析一下,事务的四大特征中,所有的操作都会走向磁盘,所以持久性是事务操作的目的,而原子性是实现事务的基础,隔离性是实现数据安全的一种策略、手段,而最终维护的,就是数据的一致性,一致性才是事务中最重要的。四大特征之间,隔离性是为了达到一致性的手段。
ACID四大特征中,最难理解的不是一致性,而是事务的隔离性,数据库权威专家针对事务的隔离性研究出来了事务的隔离四种级别,四种事务隔离级别就是为了解决数据在高并发下产生的问题(脏读、不可重复读、幻读)。
什么是脏读、不可重复读、幻读呢?我们来看看。
脏读
- 脏读就是指事务A读取到事务B修改但未提交事务的数据。
不可重复读
学习完脏读后,我们再来看看什么是不可重复读。比如事务A在同一事务中多次读取同一记录,此时事务B修改了事务A正在读的数据并且提交了事务,但是事务A读取到了事务B所提交的数据,导致两次读取数据不一致。
事务A在两次查询中,查询的数据不一样,这就是不可重复读。Mysql默认采用的就是不可重复读的隔离级别,用一句话总结,不可重复读就是事务A读取到事务B已提交事务的数据,导致两次读取数据信息不一致。
幻读
上面我我们学习了一下什么不可重复读,在mysql数据库中,不可重复读是不被允许的,mysql默认的隔离级可重复读,也就是幻读。
下面我们再来看看幻读,什么是幻读呢?事务A将数据表中所有数据都设置为100,此时事务B插入了一条值为200的数据并提交事务,当事务A修改完成提交事务后,发现还有一条数据的值不为100.这就是幻读的一种体现方式。如下图:
另外还有一种事务级别就是序列化方式SERIALIZABLE,序列化事务级别既不允许脏读,也不允许不可重复读,并且还不允许幻读。
事务隔离级别越严格,越消耗计算机性能,效率也越低,通常情况下,设置为允许不可重复读就可以解决大多数的问题了。