首页 文章 精选 留言 我的

MySQL数据库中FOR UPDATE的使用

在MySQL中,FOR UPDATE是一个非常重要的锁机制,主要用于在事务中锁定查询到的数据行,防止其他事务修改这些数据

基本语法

sql 复制代码
SELECT * FROM table_name WHERE condition FOR UPDATE;

主要作用

1. 行级排他锁

  • 对查询结果集加排他锁(X锁)
  • 其他事务无法对这些行加任何锁,包括读锁和写锁
  • 其他事务可以普通读取(取决于隔离级别),但不能修改

2. 防止数据竞争

在并发环境下,防止多个事务同时修改同一数据:

sql 复制代码
-- 事务1
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- 此时其他事务无法修改id=1的记录
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

使用场景

1. 库存扣减

sql 复制代码
START TRANSACTION;
SELECT stock FROM products WHERE id = 1001 FOR UPDATE;
-- 检查库存并扣减
UPDATE products SET stock = stock - 1 WHERE id = 1001;
COMMIT;

2. 账户余额操作

sql 复制代码
START TRANSACTION;
SELECT balance FROM accounts WHERE user_id = 123 FOR UPDATE;
-- 确保余额充足后进行转账
UPDATE accounts SET balance = balance - 500 WHERE user_id = 123;
COMMIT;

3. 订单处理

sql 复制代码
START TRANSACTION;
SELECT * FROM orders WHERE status = 'pending' FOR UPDATE;
-- 处理待处理订单
UPDATE orders SET status = 'processing' WHERE status = 'pending';
COMMIT;

注意事项

1. 必须在事务中使用

sql 复制代码
-- 错误用法(不在事务中)
SELECT * FROM table FOR UPDATE;

-- 正确用法
START TRANSACTION;
SELECT * FROM table FOR UPDATE;
-- ... 其他操作
COMMIT;

2. 锁的释放

  • 锁在事务提交或回滚时自动释放
  • 长时间持有锁会影响并发性能

3. 索引的重要性

sql 复制代码
-- 使用主键索引(高效)
SELECT * FROM users WHERE id = 1 FOR UPDATE;

-- 无索引字段可能导致表锁(性能差)
SELECT * FROM users WHERE name = 'John' FOR UPDATE;

4. 与其他锁的区别

锁类型 说明 其他事务能否读取 其他事务能否修改
FOR UPDATE 排他锁 可以(READ COMMITTED) 不可以
LOCK IN SHARE MODE 共享锁 可以 不可以

实际示例

sql 复制代码
-- 银行转账场景
START TRANSACTION;

-- 锁定转出账户
SELECT balance FROM accounts WHERE account_no = 'A001' FOR UPDATE;
-- 锁定转入账户  
SELECT balance FROM accounts WHERE account_no = 'B002' FOR UPDATE;

-- 执行转账操作
UPDATE accounts SET balance = balance - 1000 WHERE account_no = 'A001';
UPDATE accounts SET balance = balance + 1000 WHERE account_no = 'B002';

COMMIT;

性能建议

  1. 尽量缩短锁持有时间
  2. 确保查询条件使用索引
  3. 避免在高峰期对热点数据使用
  4. 考虑使用乐观锁替代

FOR UPDATE是保证数据一致性的重要工具,但需要谨慎使用以避免死锁和性能问题。

优秀的个人博客,低调大师

微信关注我们

本文章为原创内容,如需转载请注明来源!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

Kuboard4安装

Kuboard4安装

产品介绍 Kuboard是一款K8s的图形化管理界面,你可以在安装完Kuboard后,导入完整的K8s集群. 官网地址: https://www.kuboard.cn 安装准备 Kuboard基于Docker Compose安装,因此在此之前需要先安装Docker并带docker-compose指令.参考\[Dcoker安装(在线仓库)] 安装 快速搭建 sh 复制代码 # 创建目录,如 mkdir -p /data1/kuboard-v4 # 创建docker-compose.yaml文件 tee /data1/kuboard-v4/docker-compose.yaml <<-...

相关文章

发表评论

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册