在SQL标准中定义了四种事务隔离级别

Read Uncommitted(未提交读)

  • 事务可以读取未提交的数据,也被称为脏读(Dirty Read)
  • 实际应用中一般很少使用

    Read Committed(提交读)

  • 未提交的数据对于其他事务是不可见

  • 也叫做不可重复读(Nonrepeatable Read):两次相同的查询的结果可能不一样
  • 大多数数据库的默认隔离级别是提交读(MySQL不是)

    Repeatable Read(可重复读)

  • 该级别可以保证在同一个事务中的多次查询的结果是一样的

  • 可能会遇到幻读(Phantom Read)的问题
    • 幻读是指当某个事务读取某个范围内的记录时,其他事务在该范围内插入了新的记录,这时候之前的事务再次读取该范围内的记录时,会产生幻行(Phantom Row)
    • InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题
  • 可重复读是MySQL的默认事务隔离级别

    Serializable(可串行化)

  • 最高级别的隔离级别,通过强制事务串行执行,避免幻读等问题

  • 该隔离级别会在读取的每一行数据上都加上锁
  • 实际应用中一般很少使用

ANSI SQL隔离级别对比

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
Read Uncommitted
Read Committed
Repeatable Read
Serializable

参考书籍:《高性能MySQL》