当前位置: 首页 > news >正文

MySQL什么操作会加锁?

MySQL加锁机制解析:InnoDB引擎中,DML操作(UPDATE/DELETE/INSERT)自动加X锁,SELECT可通过FOR UPDATE/LOCK IN SHARE MODE显式加锁。DDL操作(ALTER/DROP TABLE等)加元数据锁,事务控制语句影响锁持有时间。锁类型包括行级锁(S/X)、间隙锁、临键锁等,受隔离级别和索引使用影响。查看锁信息可通过performance_schema,优化建议包括索引设计、避免长事务等。理解加锁机制对保证数据一致性和提升并发性能至关重要。

MySQL 加锁机制全面解析

在 MySQL 中,特别是使用 InnoDB 存储引擎时,以下操作会触发加锁机制:

一、DML 操作(数据操作语言)

1. 写操作(自动加排他锁)

  • ​UPDATE 语句​​:
    UPDATE users SET status = 1 WHERE id = 5; -- 对 id=5 的行加 X 锁
  • ​DELETE 语句​​:
    DELETE FROM orders WHERE order_id = 1001; -- 对目标行加 X 锁
  • ​INSERT 语句​​:
    INSERT INTO logs (message) VALUES ('error'); -- 对新插入行加隐式 X 锁

2. 显式加锁的读操作

  • ​SELECT ... FOR UPDATE​​:
    SELECT * FROM accounts WHERE user_id = 7 FOR UPDATE; -- 加 X 锁
  • ​SELECT ... LOCK IN SHARE MODE​​:
    SELECT * FROM products WHERE stock > 0 LOCK IN SHARE MODE; -- 加 S 锁

二、DDL 操作(数据定义语言)

1. 表结构变更

  • ​ALTER TABLE​​:
    ALTER TABLE users ADD COLUMN age INT; -- 加元数据锁(MDL)
  • ​DROP TABLE​​:
    DROP TABLE temp_data; -- 加排他 MDL 锁
  • ​TRUNCATE TABLE​​:
    TRUNCATE TABLE session_logs; -- 加表级锁

2. 索引操作

  • ​CREATE INDEX​​:
    CREATE INDEX idx_email ON customers(email); -- 加 MDL 锁
  • ​DROP INDEX​​:
    DROP INDEX idx_old ON products; -- 加 MDL 锁

三、事务控制语句

1. 事务开启

  • ​START TRANSACTION​​:
    START TRANSACTION; -- 开启事务,后续操作将持有锁直到提交

2. 事务提交/回滚

  • ​COMMIT​​ / ​​ROLLBACK​​:
    COMMIT; -- 释放事务中持有的所有锁

四、特殊操作

1. 外键约束

  • ​外键关联操作​​:
    DELETE FROM parent WHERE id = 10; -- 会检查并锁定子表相关行

2. 唯一约束检查

  • ​插入唯一值​​:
    INSERT INTO unique_codes (code) VALUES ('ABC123'); -- 加间隙锁防止幻读

3. 全表扫描(特定情况)

  • ​无索引查询​​:
    UPDATE large_table SET flag = 1 WHERE unindexed_column = 0; -- 可能锁全表

五、锁类型详解

1. 行级锁(InnoDB)

锁类型说明冲突
共享锁(S)允许并发读与 X 锁冲突
排他锁(X)独占访问与 S/X 锁冲突
意向共享锁(IS)表级锁,预示将加 S 锁与 IX/X 冲突
意向排他锁(IX)表级锁,预示将加 X 锁与 S/IS/X 冲突

2. 特殊锁

  • ​间隙锁(Gap Lock)​​:
    SELECT * FROM products WHERE price BETWEEN 100 AND 200 FOR UPDATE;
    -- 锁定价格区间,防止新记录插入
  • ​临键锁(Next-Key Lock)​​:
    SELECT * FROM orders WHERE order_id > 1000 FOR UPDATE;
    -- 锁定现有记录及间隙
  • ​插入意向锁​​:
    INSERT INTO users (name) VALUES ('John'); -- 插入前检查间隙

六、加锁规则与影响因素

1. 隔离级别影响

隔离级别加锁特性
READ UNCOMMITTED基本不加锁
READ COMMITTED只锁当前读取行
REPEATABLE READ(默认)加间隙锁防止幻读
SERIALIZABLE所有 SELECT 自动加 S 锁

2. 索引使用情况

  • ​使用主键索引​​:精确行锁
  • ​使用二级索引​​:锁索引项+主键
  • ​无索引查询​​:可能升级为表锁

3. 锁升级条件

当超过阈值时,行锁可能升级为表锁:

SHOW VARIABLES LIKE 'innodb_row_lock%';
-- innodb_row_lock_current_waits > 1000 (默认)

七、查看锁信息的方法

1. 查看当前锁

SELECT * FROM performance_schema.data_locks;

2. 查看锁等待

SELECT * FROM performance_schema.data_lock_waits;

3. InnoDB 状态

SHOW ENGINE INNODB STATUS\G
-- 查看 LATEST DETECTED DEADLOCK 部分

八、最佳实践建议

  1. ​索引优化​​:确保 WHERE 条件使用索引
  2. ​事务精简​​:尽快提交事务释放锁
  3. ​避免长事务​​:监控 information_schema.INNODB_TRX
  4. ​统一访问顺序​​:防止死锁
  5. ​合理设置隔离级别​​:非必要不使用 SERIALIZABLE

九、特殊场景处理

1. 批量更新

-- 分批次更新,避免大事务
UPDATE large_table SET status = 0 LIMIT 1000;

2. 死锁处理

-- 查看死锁日志
SHOW ENGINE INNODB STATUS\G-- 设置死锁超时
SET GLOBAL innodb_lock_wait_timeout = 30;

3. 热更新计数器

-- 使用乐观锁
UPDATE counters SET value = value + 1, version = version + 1 
WHERE id = 1 AND version = @current_version;

理解 MySQL 的加锁机制对于设计高性能、高并发的数据库应用至关重要。合理利用锁机制可以在保证数据一致性的同时,最大化系统的并发处理能力。


文章转载自:

http://Zkb6mWCF.swLwf.cn
http://i8MkDzzN.swLwf.cn
http://JMRZvSMD.swLwf.cn
http://MtkIMdwk.swLwf.cn
http://I7N6ZcwP.swLwf.cn
http://Fux9a2Dq.swLwf.cn
http://4CzO08Kt.swLwf.cn
http://NagQPXKQ.swLwf.cn
http://Gp2ICvXG.swLwf.cn
http://StUOEvMg.swLwf.cn
http://tK6rGQ1b.swLwf.cn
http://NEZF3XHV.swLwf.cn
http://JRWVDmVB.swLwf.cn
http://ybFYDz0W.swLwf.cn
http://vkCErZ0l.swLwf.cn
http://KcoA7PDT.swLwf.cn
http://3M3d7GFZ.swLwf.cn
http://UujhuABf.swLwf.cn
http://XsF8jwfE.swLwf.cn
http://0rHoBdu3.swLwf.cn
http://RgR5vLAh.swLwf.cn
http://CC0ZRiG4.swLwf.cn
http://6MMEGvyo.swLwf.cn
http://czMai24s.swLwf.cn
http://4NjXV0BR.swLwf.cn
http://3JuAEJYE.swLwf.cn
http://1blFp4Sl.swLwf.cn
http://wNpPDr4u.swLwf.cn
http://5z1r8gD8.swLwf.cn
http://3y7kkAzJ.swLwf.cn
http://www.dtcms.com/a/379222.html

相关文章:

  • 中州养老:华为云设备管理接口开发全流程
  • 探讨图片以Base64存数据库的合理性
  • MoonBit 再次走进清华:张宏波受邀参加「思源计划」与「程序设计训练课」
  • RabbitMQ如何实现消息的持久化?
  • Crawlergo安装全流程
  • 完全背包问题 - 动态规划最优解法(Java实现)
  • 如何选择合适的双轴倾角传感器厂家提升水平监测准确性?
  • 洛谷PP5318 查找文献 (深度搜索与广度搜索)详解
  • 手机云服务是什么意思?
  • Linux 基础操作全攻略:从文件解压到服务器管理
  • web:ts的类类型
  • 初识StarRocks
  • linux常见的基础命令及其作用
  • 12 Prompt 模板化与参数化
  • 自动化车间无线安灯呼叫系统解决方案
  • Oracle APEX 如何运行页面时跳过登录页
  • list容器
  • Docker Compose:轻松管理多容器应用
  • 云蝠智能大模型呼叫新模型上线,拥抱AGI
  • 网站SEO内部优化一般包括哪些内容和方法
  • 18j621-3通风天窗图集pdf(免费高清版)
  • 以下是UniApp启动速度优化的深度方案
  • GoogLeNet实战:用PyTorch实现经典Inception模块
  • verilog中task的使用
  • SpringDoc OpenAPI集成spring boot3
  • 安卓13_ROM修改定制化-----安卓 13 系统 ROM 定制化与低版本系统的核心区别
  • yolo学习笔记02——yolo简介
  • OpenCV 开发 -- 图像算术运算
  • 字符串-43.字符串相乘-力扣(LeetCode)
  • java properties/反射基础