MySQL事务+FOR UPDATE解决并发操作数据库

注意 FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。

由于InnoDB 预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

例如下面几种情况

A.假设有个表单products ,里面有id 跟name 二个栏位,id 是主键。

(明确指定主键,并且有此数据,row lock也就是行锁)

SELECT * FROM products WHERE id='3' FOR UPDATE;

B.(明确指定主键,若查无此数据,无lock)

SELECT * FROM products WHERE id='-1' FOR UPDATE;

C.(无主键,table lock)

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

D .(主键不明确,table lock)

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

要测试锁定的状况,可以利用MySQL 的Command Mode ,开二个视窗来做测试

MySQL update && select

CREATE TABLE `testupdate` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`val` bigint(20) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

update testupdate

set val = val+1

where id = 1 and @value := val+1;

select @value;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • MySQL 数据库常用命令 1、MySQL常用命令 create database name; 创建数据库 use...
    55lover阅读 10,359评论 1 57
  • SQL SELECT 语句 一、查询SQL SELECT 语法 (1)SELECT 列名称 FROM 表名称 (2...
    有钱且幸福阅读 11,114评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,513评论 18 399
  • MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子...
    沉默剑士阅读 12,159评论 0 16
  • 我亲爱的宝贝,今天就是你一周岁生日了,首先,妈妈最你生日快乐!时间过得真快,仿佛还在昨天,妈妈还为挺着一个大肚子遮...
    鸿瑜妈妈阅读 1,873评论 0 0

友情链接更多精彩内容