mysql for update_mysql SELECT FOR UPDATE语句使用示例

以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:

SELECT ... LOCK IN SHARE MODE SELECT ... 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 就可以这样测试:

复制代码 代码如下:

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 如此可以确保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 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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html4基础,HTML 基础 4

有序列表、无序列表和自定义列表无序列表适合所有并列或没有上下级关系的条目的显示有序列表适合有明确排序的条目的显示自定义列表更突出自定义标题可以直接在 li 和 dd 中写新的列表来嵌套如何去除列表前的点或者数字li{list-style: none;}class和id的区别以及适用情况class可…

mysql 主键长度_MySQL 数据库,主键为何不宜太长长长长长长长长?

回答星球水友提问&#xff1a;沈老师&#xff0c;我听网上说&#xff0c;MySQL数据表&#xff0c;在数据量比较大的情况下&#xff0c;主键不宜过长&#xff0c;是不是这样呢&#xff1f;这又是为什么呢&#xff1f;这个问题嘛&#xff0c;不能一概而论&#xff1a;(1)如果是In…

计算机有多少种开发语言,为什么现在会有这么多种编程语言?

21世纪&#xff0c;计算机的应用越来越多&#xff0c;为了适应各种使用场景&#xff0c;于是诞生了各种语言&#xff0c;不仅语言是多样的&#xff0c;每种语言下面都有不同的开发框架&#xff0c;框架也是多样的。有时候为了性能&#xff0c;可能会选择编译型语言&#xff0c;…

mysql是小型数据库_mysql小型数据库

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

计算机保护地阻值,机房接地系统的一般接地电阻要小于多少欧姆?

机房接地系统宜采用综合接地方案&#xff0c;综合接地电阻应小于1欧姆。机房接地系统&#xff1a;(1)机房有四种接地方式&#xff1a;交流工作地、安全保护地、直流工作地和防雷保护地。(2)信号系统和电源系统、高压系统和低压系统不应使用共地回路。(3)灵敏电路的接地应各自隔…

计算机丢失wpcap.dll会影响什么,Win7系统提示wpcap.dll丢失如何解决?

最近有Win7系统用户反映&#xff0c;打开程序或者玩游戏的过程中都会出现wpcap.dll丢失的提示&#xff0c;这直接导致了程序无法正常打开以及游戏无法正常运行&#xff0c;用户为此非常苦恼。那么&#xff0c;Win7系统提示wpcap.dll丢失如何解决呢&#xff1f;下面&#xff0c;…

centos安装mysql5.7.12_CentOS二进制安装MySQL5.7.12

1、检查服务器上是否有其他版本的mysql数据库&#xff0c;可能会影响现有安装的数据库&#xff0c;卸载之yum -y remove mysql-libs-5.1.73* (rpm -e mysql..... --nodeps)2、安装mysqltar -zxvf mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz -C /usr/local/(解压安装包文件)mv …

vue打包上线部分css效果错乱,vue-cli2打包后css部分样式错乱

鼓捣半天&#xff0c;现在如下配置&#xff0c;能成功运行。还在查资料ingbuild/utils.js...function generateLoaders (loader, loaderOptions) {const loaders options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]if (loader) {loaders.push({loader: loader …

mysql搜索标题及时间_mysql搜索标题,描述和多行标记

我有以下表格。入口表描述--------------------------------------------------------------------| Field | Type | Null | Key | Default | Extra |--------------------------------------------------------------------| id | int(11) unsigned | NO | PRI | NULL | auto_…

ajax让服务器崩溃,详解ajax的data参数错误导致页面崩溃

今天准备把选定表格的其中一行的数据通过ajax传给后端&#xff0c;但是网站确崩溃了。代码如下&#xff1a;$(.icon-edit).click(function (event) { 这是一个按钮o$(.icon-edit).index($(this))1;edit.style.displayblock;//console.log($(this),$(this).parent().parent());l…

linux 启动一个网站_在线试用 200 多种 Linux 和 Unix 操作系统

只要打开该网站&#xff0c;选择你需要的 Linux/Unix 发行版&#xff0c;然后开始试用&#xff01;-- Sk(作者)不久前我们介绍过 OSBoxes &#xff0c;该网站提供了一系列免费且开箱即用的 Linux 和 Unix 虚拟机。你可以在你的 Linux 系统中下载这些虚拟机并用 VirtualBox 或 V…

搭建微信令牌中控服务器,使用ThinkJs搭建微信中控服务的实现方法

本人前端渣渣一枚&#xff0c;这篇文章是第一次写&#xff0c;如果有硬核bug&#xff0c;请大佬们轻喷、指出... 另外&#xff0c;本文不涉及任何接口安全、参数校验之类的东西&#xff0c;默认对调用方无脑级的信任:joy: 目前自用的接口包括但不限于以下这些|--- 微信相关| |-…

小黑框如何连接mysql_珍藏版(cmd小黑框)数据库命令及操作

话不多说直接来&#xff0c;后续补充。查看数据库show databases;创建数据库create database 2018;使用数据库use 2018;查看数据库中的所有表show tables;删除数据库drop database 库名;create table student(id int(10) auto_increment primary key,name varchar(20) not null…

DS系列服务器硬盘扇区,硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)...

硬盘的DOS管理结构1.磁道&#xff0c;扇区&#xff0c;柱面和磁头数硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片&#xff0c;不同容量硬盘的盘片数不等。每个盘片有两面&#xff0c;都可记录信息。盘片被分成许多扇形的区域&#xff0c;每个区域叫一个扇区&…

arm ubuntu 编译boost_为arm linux 交叉编译boost 1.33.1

首先在arm linux环境上要有zlib1 解开boost压缩包, cd进入解压目录2 编译出bjam,并配置好&#xff0c;看手册页3 产生Makefile: ./configure "-sBUILDdebug release static/dynamic" --without-python4 更改Makefile:把文件头上的几个变量改成下面这样&#xff0c;我…

华为服务器sn号查询网站,linux 查询服务器sn

linux 查询服务器sn 内容精选换一换Linux云服务器变更规格时&#xff0c;可能会发生磁盘挂载失败的情况&#xff0c;因此&#xff0c;变更规格后&#xff0c;需检查磁盘挂载状态是否正常。本节操作介绍变更规格后检查磁盘挂载状态的操作步骤。以root用户登录云服务器。执行以下…

jdba访问mysql_mysql连接出现问题记录

解决&#xff1a;Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone valu//报错信息Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ‘‘ is unrecognized or represents…

mysql 存储引擎版本_mysql不同版本和存储引擎选型的验证

Mysql的版本和存储引擎较多&#xff0c;为了选择最适合业务使用的系统&#xff0c;需要进行一定的验证&#xff0c;本文描述mysql的验证过程和思路。主要涉及&#xff1a;Mysql的版本v Mariadbv Tokudbv Oracle具体的存储引擎v Myisamv Innodbv TokuDBv Maria如下是具体的思路M…

python制作表白神器_python制作exe可执行表白神器-Go语言中文社区

1、效果图2、程序源码import turtleimport time#writing txtturtle.hideturtle()turtle.penup()turtle.goto(130,50)# turtle.pendown()turtle.color("blue")turtle.write("亲爱的&#xff0c;给你画个东西",font ("Times",18,"bold"…

qtp连接mysql 无驱动_QTP连接MySQL

1、安装 Connector/ODBC2、查看数据源名称『控制面板』- 『管理工具』- 『数据源(ODBC)』-『添加』3、连接数据库Dim Conn,ConnString创建数据库实例Set ConnCreateObject("ADODB.Connection")连接字符串ConnString"Driver{Mysql ODBC 5.2w Driver};DATABASEmys…