0

0

MySQL数据库select for update的使用方法

黄舟

黄舟

发布时间:2016-12-24 17:26:25

|

3714人浏览过

|

来源于php中文网

原创

mysql select for update
mysql  使用select ... for update 做事务写入前的确认 
以mysql 的innodb 为例,预设的tansaction isolation level 为repeatable read,在select 的读取锁定主要分为两种方式: 
select ... lock in share modeselect ... for update 
这两种方式在事务(transaction) 进行当中select 到同一个数据表时,都必须等待其它事务数据被提交(commit)后才会执行。而主要的不同在于lock in share mode 在有一方事务要update 同一个表单时很容易造成死锁 。 
简单的说,如果select 后面若要update 同一个表单,最好使用select ... update。 
举个例子: 假设商品表单products 内有一个存放商品数量的quantity ,在订单成立之前必须先确定quantity 商品数量是否足够(quantity>0) ,然后才把数量更新为1。 
不安全的做法: 
select quantity from products where id=3; 
update products set quantity = 1 where id=3; 
为什么不安全呢?
少量的状况下或许不会有问题,但是大量的数据存取「铁定」会出问题。 
如果我们需要在quantity>0 的情况下才能扣库存,假设程序在第一行select 读到的quantity 是2 ,看起来数字没有错,但是当mysql 正准备要update 的时候,可能已经有人把库存扣成0 了,但是程序却浑然不知,将错就错的update 下去了。 
因此必须透过的事务机制来确保读取及提交的数据都是正确的。 
于是我们在mysql 就可以这样测试: (注1) 
set autocommit=0; 
begin work; 
select quantity from products where id=3 for update; 
=========================================== 
此时products 数据中id=3 的数据被锁住(注3),其它事务必须等待此次事务提交后才能执行select * from products where id=3 for update (注2)如此可以确保quantity 在别的事务读到的数字是正确的。=========================================== 
update products set quantity = '1' where id=3 ; 
commit work; 
=========================================== 
提交(commit)写入数据库,products 解锁。 
注1: begin/commit 为事务的起始及结束点,可使用二个以上的mysql command 视窗来交互观察锁定的状况。
注2: 在事务进行当中,只有select ... for update 或lock in share mode 同一笔数据时会等待其它事务结束后才执行,一般select ... 则不受此影响。 
注3: 由于innodb 预设为row-level lock,数据列的锁定可参考这篇。 
注4: innodb 表单尽量不要使用lock tables 指令,若情非得已要使用,请先看官方对于innodb 使用lock tables 的说明,以免造成系统经常发生死锁。 
mysql select ... for update 的row lock 与table lock 
上面介绍过select ... for update 的用法,不过锁定(lock)的数据是判别就得要注意一下了。由于innodb 预设是row-level lock,所以只有「明确」的指定主键,mysql 才会执行row lock (只锁住被选取的数据) ,否则mysql 将会执行table lock (将整个数据表单给锁住)。 
举个例子:
假设有个表单products ,里面有id 跟name 二个栏位,id 是主键。 
例1: (明确指定主键,并且有此数据,row lock) 
select * from products where id='3' for update; 
例2: (明确指定主键,若查无此数据,无lock) 
select * from products where id='-1' for update; 
例2: (无主键,table lock) 
select * from products where name='mouse' for update; 
例3: (主键不明确,table lock) 
select * from products where id'3' for update; 
例4: (主键不明确,table lock) 
select * from products where id like '3' for update; 
注1: for update 仅适用于innodb,且必须在事务区块(begin/commit)中才能生效。 
注2: 要测试锁定的状况,可以利用mysql 的command mode ,开二个视窗来做测试。 

 以上就是MySQL数据库select for update的使用方法的内容,更多相关内容请关注PHP中文网(www.php.cn)!

SmartB2B行业电子商务
SmartB2B行业电子商务

SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

4

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

74

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

9

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

3

2026.02.12

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

43

2026.02.12

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

295

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

957

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

103

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 833人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号