msyql 锁

  1. ‌无索引的全表扫描‌

    • 当查询条件未命中索引时,InnoDB 无法精确定位行,会将行锁升级为表锁‌36。
    • 例如:SELECT * FROM table WHERE unindexed_column = 1 FOR UPDATE,此时会锁定整张表‌36。
  2. 意向锁是用来表明已经有行锁了。如果要加表锁,就要先申请意向锁。比如在update一条数据时,就会自动在这个表上加上一条意向排他锁(表锁),防止其它表锁。如果现在有一个ddl语句来执行,那么就会要求这个锁释放完才会获取到锁。

‌2. IX 锁与表级 X 锁冲突‌

‌场景描述‌:

  • ‌事务1‌ 对某行加 ‌行级排他锁(X Lock)‌,自动获取表的 ‌意向排他锁(IX Lock)‌‌35。
  • ‌事务2‌ 执行 ALTER TABLE 等 DDL 操作,需获取表的 ‌排他锁(X Lock)‌,但被事务1的 IX 锁阻塞‌35。

 

 

‌三、注意事项‌

    1. ‌锁升级机制‌
      InnoDB默认使用行级锁,但在以下情况可能升级为表级锁:

      • 未命中索引的查询导致全表扫描时,可能触发表锁‌15。
      • 显式执行LOCK TABLES语句时强制使用表级锁‌6。
    2. ‌意向锁的辅助作用‌
      表级意向锁(IS/IX)用于快速判断表中是否存在行级锁,避免全表扫描。例如:

      • 事务A对某行加行级S锁时,表级IS锁被记录‌6。
      • 事务B尝试加表级X锁时,检测到IS锁存在,直接阻塞‌57。
posted on 2025-04-18 23:05  Hi Martin  阅读(18)  评论(0)    收藏  举报