MST

星途 面试题库

面试题:MySQL写多读少场景中,行级锁的加锁原则有哪些?

在MySQL写多读少场景下,简要阐述行级锁的加锁原则,例如在不同的操作(如INSERT、UPDATE、DELETE)以及不同的事务隔离级别下,行级锁是如何添加的?
24.0万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

INSERT操作

  1. 自动加锁:在执行INSERT操作时,MySQL会自动对插入的行添加排他锁(X锁),以防止其他事务同时插入相同的数据。这确保了数据的唯一性和一致性。例如,在向具有唯一索引的表中插入数据时,MySQL会先检查是否存在冲突,若不存在则加锁插入。
  2. 锁的释放:插入操作完成后,在当前事务提交或回滚时,排他锁会被释放。

UPDATE操作

  1. 不同事务隔离级别下的加锁
    • 读未提交(Read Uncommitted):此隔离级别下,UPDATE操作会对满足条件的行加排他锁(X锁),允许脏读。例如执行UPDATE table SET column = value WHERE condition;,满足condition的行都会被加上X锁。
    • 读已提交(Read Committed):同样对满足条件的行加排他锁(X锁),但仅在语句执行期间持有锁。当语句执行完,锁就会释放。例如,一个事务中多条UPDATE语句,每条语句执行时加锁,执行完解锁。
    • 可重复读(Repeatable Read):不仅对满足条件的行加排他锁(X锁),还会对索引记录加锁(Next-Key Lock),防止幻读。如果条件基于唯一索引且能确定唯一行,则只加行锁;否则加Next-Key Lock。例如,在可重复读隔离级别下,多次执行相同的UPDATE语句,中间即使有其他事务插入满足条件的数据,也不会出现幻读情况。
    • 串行化(Serializable):对整个表加锁,等同于将所有操作串行化执行。UPDATE操作时,会对表中所有可能满足条件的行加排他锁(X锁),阻止其他事务对表的任何读写操作。
  2. 锁的释放:在事务提交或回滚时,UPDATE操作所加的锁会被释放。

DELETE操作

  1. 加锁方式:DELETE操作与UPDATE操作类似,在不同事务隔离级别下加锁方式相似。对满足删除条件的行加排他锁(X锁)。例如DELETE FROM table WHERE condition;,满足condition的行都会被加上X锁。
  2. 锁的释放:在事务提交或回滚时,DELETE操作所加的锁会被释放。

总结

  1. 行级锁的目的是为了保证在并发操作下数据的一致性和完整性。
  2. 不同的事务隔离级别对行级锁的使用方式有影响,隔离级别越高,锁的粒度可能越大,并发性能可能越低,但数据一致性更有保障。在写多读少场景下,合理选择事务隔离级别和锁机制,可以在保证数据一致性的同时,尽量提高系统的并发处理能力。