MST

星途 面试题库

面试题:MySQL中如何通过锁策略防止不可重复读

在MySQL中,不可重复读是一个常见的问题,阐述一下MySQL是如何运用锁策略来防止不可重复读现象的发生,包括涉及到的锁类型及具体机制。
15.6万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

锁策略防止不可重复读

  1. 锁类型
    • 共享锁(S锁):也叫读锁,若事务对数据对象A加了共享锁,其他事务只能对A再加共享锁,不能加排他锁,直到该事务释放A上的共享锁。这样多个事务可以同时读取数据,但不允许修改。
    • 排他锁(X锁):也叫写锁,若事务对数据对象A加了排他锁,其他事务不能再对A加任何类型的锁,直到该事务释放A上的排他锁。这保证了只有持有排他锁的事务能对数据进行修改。
  2. 具体机制
    • 事务隔离级别为可重复读(默认):在可重复读隔离级别下,MySQL通过MVCC(多版本并发控制)机制和锁机制共同防止不可重复读。
      • MVCC:事务开启时,会为该事务生成一个一致性视图,该视图包含了当时数据库中所有符合条件的版本数据。在整个事务执行期间,所有读取操作都基于这个视图进行,这样即使其他事务修改了数据,本事务看到的数据仍然是事务开始时的版本,从而避免了不可重复读。
      • 锁机制:当一个事务执行写操作时,会对相关数据加排他锁,阻止其他事务对该数据的并发修改。而读操作会加共享锁,并且在事务持续期间,共享锁不会释放,这样保证了在同一事务内多次读取相同数据时,数据不会被其他事务修改,从而防止了不可重复读。
    • 事务隔离级别为串行化:此隔离级别下,所有事务串行执行,每个事务执行时都会对涉及的数据加锁,完全避免了并发问题,自然也就防止了不可重复读。读操作加共享锁,写操作加排他锁,并且只有前一个事务释放锁后,下一个事务才能获取锁并执行,从而保证了数据一致性。