Mysql:select ...for update
这几天遇到了select … for update的sql语句,决定整理一下mysql的两种锁机制。
Mysql数据库有两种锁,一种是共享锁,一种是排他锁,这两种锁是针对InnoDB的,如果是MyISM不是这样的锁机制。
共享锁和拍他锁的锁对象是主键!
共享锁(读锁,S锁)
select … from … lock in share mode
多个事务共享一把锁,但是只能读,不能修改。当有事务拿到共享锁的时候且锁未释放时,另一个事务不能去修改加锁的数据。
共享锁的最大特点是可以共享,多个事务可以同时获取锁并且读到数据,并且,在锁没有释放时,数据不能被修改,这样可以避免数据库脏读和不可重复读的问题。
排他锁(互斥锁,写锁,X锁)
select … for update;
排他锁不能被多个事务共享,如果一个事务获取了一行数据的排他锁,那么其他事务就不能获取这行数据的锁,包括共享锁和排他锁。获取到排他锁的事务可以对数据进行读取和修改,事务提交后,锁释放。
演示
创建一张用于测试的表格
CREATE TABLE `emipe_user_entity` (`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '主键',`user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户名',`pass_word` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户密码',`status` int(11) DEFAULT NULL COMMENT '用户状态',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
使用InnoDB储存引擎,InnoDB既支持行级锁,又支持表级锁,默认情况下采用行级锁
MySQL InnoDB引擎默认的update,delete,insert语句会自动给涉及到的数据加上排他锁。
为测试的表格存入数据
INSERT INTO `emipe_user_entity` VALUES ('1', '小红帽', '123456', 0);
INSERT INTO `emipe_user_entity` VALUES ('2', '路人甲', '523456', 0);
共享锁
事务A:获取共享锁,但不提交事务
begin;
select * from emipe_user_entity where id = 1 lock in share mode;
事务B:获取共享锁,可以查询到数据
select * from emipe_user_entity where id = 1 lock in share mode;
事务C:尝试修改带有共享锁的数据,报错
update emipe_user_entity set pass_word = '222222' where id = 1;
结果:
事务C首先会等待共享锁释放,待锁释放后,可以对改数据进行修改,由于事务A一直没有释放锁,在长久的等待后,事务C抛错:
Lock wait timeout exceeded;try restarting trasacrtion. 等待锁超时;尝试重启这个事务
排他锁
事务A:获取排他锁进行查询,事务不提交
begin;
select * from emipe_user_entity where id = 1 for update;
事务B:尝试获取排他锁,被阻塞
select * from emipe_user_entity where id = 1 for update;
事务C: 尝试获取共享锁,被阻塞
select * from emipe_user_entity where id = 1 lock in share mode;
事务D:在不使用锁的情况下,可以查询数据
select * from emipe_user_entity where id = 1;
-- 查询成功
普通的查询语句没有任何锁机制。
Mysql:select ...for update相关推荐
- mysql begin end 用法_数据库:Mysql中“select ... for update”排他锁分析
作者:志波同学来源:https://mp.weixin.qq.com/s/8uH-7TD9ZRG4NCya80mOHg Mysql InnoDB 排他锁 用法:select - for update; ...
- mysql update 排他锁_数据库:Mysql中“select ... for update”排他锁分析
Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...
- 数据库:Mysql中“select ... for update”排他锁分析
Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...
- MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认(转)
Select-For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就是满足w ...
- 【转】MySQL中select * for update锁表的问题
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- MySql事务select for update及数据的一致性处理讲解
MySQL中的事务,默认是自动提交的,即autocommit = 1: 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果 ...
- 数据操纵:SELECT, INSERT, UPDATE, DELETE
1 SELECT 句法 2 3 SELECT [STRAIGHT_JOIN] 4 [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 5 [ ...
- 面试官问:select......for update会锁表还是锁行?
欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...
- MySQL:SELECT COUNT 小结
作者 | 翁智华 来源 | https://www.jianshu.com/p/4913fdd1e277 背景 今天团队在做线下代码评审的时候,发现同学们在代码中出现了 select count(1) ...
最新文章
- IDEA配置GitHub报错GitHub Invalid authentication data.404 Not Found-Not Found
- java 8 stream reduce详解和误区
- JavaWeb 后端 三 之 Response Request 学习笔记
- 【英语学习】【WOTD】regale 释义/词源/示例
- Mybatis在Maven项目中使用
- 如何利用nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查
- MySQL之终端(Terminal)管理MySQL
- 知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3
- 华成英-模拟电子技术P13 多级放大器 笔记
- NTLite精简Windows 7 Ultimate SP1
- win7计算机共享设置密码,如何为Win7旗舰系统的共享文件夹设置密码
- python爬虫-selenium爬取链家网房源信息
- idea关闭当前窗口的快捷键
- SpringBoot项目H5界面手机拍照调用腾讯云OCR卡证识别接口完整例子
- 内存不能为读的解决办法
- wayland学习一 ——client connect到wayland server
- AC-DC电源管理芯片选型及应用
- 任务调度 cron使用
- 用python解方程组
- docker是干什么的,docker常用命令