这几天遇到了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相关推荐

  1. mysql begin end 用法_数据库:Mysql中“select ... for update”排他锁分析

    作者:志波同学来源:https://mp.weixin.qq.com/s/8uH-7TD9ZRG4NCya80mOHg Mysql InnoDB 排他锁 用法:select - for update; ...

  2. mysql update 排他锁_数据库:Mysql中“select ... for update”排他锁分析

    Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...

  3. 数据库:Mysql中“select ... for update”排他锁分析

    Mysql InnoDB 排他锁 用法: select - for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ...

  4. MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认(转)

    Select-For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句. 该语句用来锁定特定的行(如果有where子句,就是满足w ...

  5. 【转】MySQL中select * for update锁表的问题

    MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...

  6. MySql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1: 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果 ...

  7. 数据操纵:SELECT, INSERT, UPDATE, DELETE

    1 SELECT 句法 2 3 SELECT [STRAIGHT_JOIN] 4 [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 5 [ ...

  8. 面试官问:select......for update会锁表还是锁行?

    欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...

  9. MySQL:SELECT COUNT 小结

    作者 | 翁智华 来源 | https://www.jianshu.com/p/4913fdd1e277 背景 今天团队在做线下代码评审的时候,发现同学们在代码中出现了 select count(1) ...

最新文章

  1. IDEA配置GitHub报错GitHub Invalid authentication data.404 Not Found-Not Found
  2. java 8 stream reduce详解和误区
  3. JavaWeb 后端 三 之 Response Request 学习笔记
  4. 【英语学习】【WOTD】regale 释义/词源/示例
  5. Mybatis在Maven项目中使用
  6. 如何利用nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查
  7. MySQL之终端(Terminal)管理MySQL
  8. 知识图谱-命名实体-关系-免费标注工具-快速打标签-Python3
  9. 华成英-模拟电子技术P13 多级放大器 笔记
  10. NTLite精简Windows 7 Ultimate SP1
  11. win7计算机共享设置密码,如何为Win7旗舰系统的共享文件夹设置密码
  12. python爬虫-selenium爬取链家网房源信息
  13. idea关闭当前窗口的快捷键
  14. SpringBoot项目H5界面手机拍照调用腾讯云OCR卡证识别接口完整例子
  15. 内存不能为读的解决办法
  16. wayland学习一 ——client connect到wayland server
  17. AC-DC电源管理芯片选型及应用
  18. 任务调度 cron使用
  19. 用python解方程组
  20. docker是干什么的,docker常用命令

热门文章

  1. 【电力电子技术DC-AC】三相SPWM逆变器Simulink仿真(设置死区时间)
  2. super 和 this
  3. 哇呼IM即时通讯系统——技术解析
  4. 三翼鸟,用两年开启下一个十年
  5. Angular2+ 双向数据绑定
  6. iOS-根据银行卡号判断银行名称
  7. 图像处理与机器视觉行业分析
  8. PDF格式分析(六十六) Text 文字——简单字体
  9. gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
  10. [翻译]pb技巧、代码和实用工具[程序员家园论坛]