mysql事务的隔离级别

什么是事务

将对数据库的一连串操作抽象为一个事务,那么这个事务具有一下特性

  1. 原子性(Atomicity

    事务是一个不可分割的操作单位,事务中的操作要么都发生,要么都不发生。

  2. 一致性(Consistency)

    事务前后数据的完整性必须保持一致。

  3. 隔离性(Isolation)

    不同的事务之间有一定的隔离性,保证某一事务的操作对其他事务的操作的影响在可控范围

  4. 持久性(Durability)

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

什么是事务的隔离级别

良好的事务隔离性需要确保事务之间的操作能够做到相互不被影响,可实际上在并发情况下,多个事务同时对数据库进行操作,就有可能会产生脏读、不可重复读、幻读的情况。那么数据库厂商就会对数据库设置不同的隔离级别,在业务上如果能够允许出现少数错误,那就可以把隔离级别设低些,以换取更高的并发,更高的吞吐量。

下面详细解释这三种问题,隔离级别等级由低到高,能够依次解决这些问题。

隔离级别最低为Read uncommitted,三种问题都可能会发生

  • 脏读:事务b先对某条数据进行修改或新增,事务a读到了这条数据,此后事务b回退了,事务a再去读,发现这条数据不一样或者没有了。见图
事务脏读.png

隔离级别采用Read committed(提交读)级别可以避免这种问题

  • 不可重复读:事务a首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。

    也就是说,当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配,也就照应了不可重复读的语义。见图

事务不可重复读.png

隔离级别采用Repeatable read(重复读)可避免这种问题

  • 幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。也就是说,当前事务读第一次取到的数据比后来读取到数据条目少。

隔离级别采用Serializable可避免这种问题

幻读和不可重复读的区别

幻读针对的是添加数据,不可重复读针对的是修改数据

你可能感兴趣的:(mysql事务的隔离级别)