MST

星途 面试题库

面试题:MySQL排他锁如何保障单表写操作的原子性

在MySQL中,当对一张表进行写操作(如INSERT、UPDATE、DELETE)时,排他锁是怎样确保操作的原子性的?请描述其基本原理和加锁机制。
44.2万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

基本原理

  1. 原子性定义:原子性要求一个事务中的所有操作要么全部成功执行,要么全部不执行。在MySQL写操作场景下,排他锁通过阻止其他事务对同一资源进行并发写操作,保证当前写操作相关的一系列数据库修改作为一个整体执行,不会被其他事务干扰,从而实现原子性。
  2. 隔离数据修改:当一个事务获取到排他锁后,就相当于对该数据资源(如某一行数据或某一页数据)进行了独占。其他事务想要对同一资源进行任何写操作(INSERT、UPDATE、DELETE)或某些读操作(如一致性读需要获取共享锁,与排他锁互斥)都必须等待该排他锁被释放。这就确保了在持有排他锁期间,当前事务对数据的修改不会被其他事务覆盖或干扰,如同将这些修改操作包裹在一个原子单元内。

加锁机制

  1. 行级锁
    • 适用场景:在InnoDB存储引擎中,对于基于索引条件的写操作(如UPDATE users SET age = 25 WHERE id = 1;,假设id是索引列),通常使用行级锁。
    • 加锁过程:事务会根据SQL语句中的条件定位到对应的索引记录,然后对这些索引记录所在的行加上排他锁。只有持有该行排他锁的事务才能对该行数据进行修改。其他事务如果试图对同一行进行写操作,会进入等待状态,直到持有锁的事务提交或回滚,释放了排他锁。
  2. 表级锁
    • 适用场景:当操作无法通过索引精准定位到具体行(如UPDATE users SET age = 25;,没有WHERE条件或者WHERE条件没有使用索引),或者某些存储引擎(如MyISAM)本身不支持行级锁时,会使用表级锁。
    • 加锁过程:事务会对整个表加上排他锁,这意味着在锁被持有期间,其他事务不能对该表进行任何写操作,甚至某些读操作(取决于存储引擎和隔离级别)也会被阻塞。只有持有表级排他锁的事务可以对表中的数据进行INSERT、UPDATE、DELETE操作。当事务执行完毕(提交或回滚),表级排他锁才会被释放,其他事务才能对该表进行操作。
  3. 意向锁
    • 适用场景:意向锁主要用于协调行级锁和表级锁,避免死锁和提高锁的兼容性。
    • 加锁过程:当事务想要对某一行数据加排他锁(行级)时,会首先对包含该行的表加上意向排他锁(IX锁)。意向排他锁表明事务即将对表中的某些行加排他锁。如果其他事务想要对整个表加排他锁(表级),它需要检查表上是否有意向排他锁。如果存在意向排他锁,说明有事务正在或即将对表中的某些行进行写操作,此时表级排他锁不能获取,从而避免了锁冲突和死锁。