转:http://www.kubiji.cn/topic-id2510.html
行级锁是mysql中粒度最小的一种锁,他能大大减少数据库操作的冲突。但是粒度越小,实现的成本也越高。myisam引擎只支持表级锁,而innodb引擎能够支持行级锁,下面的内容也是针对INNODB行级锁展开的。

INNODB的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种。共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改。排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录。

共享锁:
用法: SELECT ... LOCK IN SHARE MODE;

MySQL会对查询结果集中每行都添加共享锁。

锁申请前提:当前没有线程对该结果集中的任何行使用排他锁,否则申请会阻塞。

操作限制:

使用共享锁线程与不使用共享锁线程对锁定记录操作限制表

线程 读取操作 写入操作 共享锁申请 排他锁申请
使用共享锁 可读 可写/不可写(报错) 可申请 可申请
不使用共享锁 可读 不可写(阻塞) 可申请 不可申请(阻塞)

1. 使用共享锁线程可对其锁定记录进行读取,其他线程同样也可对锁定记录进行读取操作,并且这两个线程读取的数据都属于同一个版本。

2. 对于写入操作,使用共享锁的线程需要分情况讨论,当只有当前线程对指定记录使用共享锁时,线程是可对该记录进行写入操作(包括更新与删除),这是由于在写入操作前,线程向该记录申请了排他锁,然后才进行写入操作;当其他线程也对该记录使用共享锁时,则不可进行写入操作,系统会有报错提示。不对锁定记录使用共享锁的线程,当然是不可进行写入操作了,写入操作会阻塞。

3. 使用共享锁进程可再次对锁定记录申请共享锁,系统并不报错,但是操作本身并没有太大意义。其他线程同样也可以对锁定记录申请共享锁。

4. 使用共享锁进程可对其锁定记录申请排他锁;而其他进程是不可以对锁定记录申请排他锁,申请会阻塞。
  排他锁:

用法: SELECT ... FOR UPDATE;

MySQL会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。

锁申请前提:当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。

操作限制:

使用排他锁线程与不使用排他锁线程对锁定记录操作限制表

线程 读取操作 写入操作 共享锁申请 排他锁申请
使用排他锁 可读(新版本) 可写 可申请 可申请
不使用排他锁 可读(旧版本) 不可写(阻塞) 不可申请(阻塞) 不可申请(阻塞)

1. 使用排他锁线程可以对其锁定记录进行读取,读取的内容为当前事物的最新版本;而对于不使用排他锁的线程,同样是可以进行读取操作,这种特性是一致性非锁定读。即对于同一条记录,数据库记录多个版本,在事物内的更新操作会反映到新版本中,而旧版本会提供给其他线程进行读取操作。

2. 使用排他锁线程可对其锁定记录进行写入操作;对于不使用排他锁的线程,对锁定记录的写操作是不允许的,请求会阻塞。

3. 使用排他锁进程可对其锁定记录申请共享锁,但是申请共享锁之后,线程并不会释放原先的排他锁,因此该记录对外表现出排他锁的性质;其他线程是不可对已锁定记录申请共享锁,请求会阻塞。

4. 使用排他锁进程可对其锁定记录申请排他锁(实际上并没有任何意义);而其他进程是不可对锁定记录申请排他锁,申请会阻塞。

来源:http://www.thinkphp.cn/topic/44905.html

MySQL锁的用法之行级锁相关推荐

  1. mysql 锁怎么使用_MySQL锁的用法之行级锁

    行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突.但是粒度越小,实现的成本也越高.MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNODB行级锁 ...

  2. mysql行级锁 表级锁 页级锁详细介绍_MySQL行级锁、表级锁、页级锁详细介绍

    页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...

  3. MySQL数据库事务中的行级锁,表级锁,页级锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  4. mysql行级锁升级_mysql innodb 行级锁升级

    创建数据表test,表定义如下所示: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NO ...

  5. 【MySQL】InnoDB中的行级锁

    行锁,也称为记录锁,顾名思义就是在记录上加的锁.但是要注意,这个记录指的是通过给索引上的索引项加锁.InnoDB 这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,In ...

  6. MySQL中的行级锁,表级锁,页级锁

    数据库锁是数据库系统中非常重要的一个概念,本文将深入分析数据库中的锁相关知识,您可点击下方音频收听或直接查看文稿中的文字. 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并 ...

  7. mysql数据库的行级锁有几种_MySQL中的行级锁、表级锁、页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...

  8. MYSQL中表级锁、行级锁、页级锁介绍

    一.MYSQL数据库锁的种类 在数据库系统中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 1.行级锁 行级锁是Mysql中锁定粒度最 ...

  9. Mysql中的行级锁、表级锁、页级锁

    转载自 Mysql中的行级锁.表级锁.页级锁 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按 ...

最新文章

  1. 袖口里的“超能力”:Facebook腕带式AR传感器,可隔空打字、操控界面,LeCun点赞...
  2. 洛谷U4727小L的二叉树[树转序列 LIS]
  3. javaweb:servlet过滤器
  4. 程序不能使用中文名_这几款车没有中文名?那买车时应该怎么叫?
  5. ALEIDoc EDI(2)--一般流程
  6. DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation(笔记)
  7. 第二十一期:老大难的GC原理及调优,这全说清楚了
  8. 冯诺依曼原理中计算机包括功能部件,水泥越细,强度发展越快,对混凝土性能也越好...
  9. 系统上关闭是意外的_紧急关闭iOS13,有史以来跳版本关闭系统
  10. 17秋 软件工程 团队作业 同学录
  11. 小米8 android9手势,当小米8SE遇到安卓9.0,体验提升一个等级!
  12. 开源实时视频码流分析软件 VideoEye
  13. 不可错过的效能利器「GitHub 热点速览 v.22.39」
  14. 网络工程师考试视频教程
  15. 2021大学网课答案搜题公众号
  16. 活性污泥法生活污水处理设备的参数详解
  17. Springboot+vue项目实验室管理系统
  18. 逆向分析系列——查壳侦壳工具
  19. 总后台顶部实现站内信功能
  20. 这10个思路,能帮你设计出简单易用的网页

热门文章

  1. linux 命令行 ctrl z,Linux操作系统下运行命令时CTRL+Z的作用
  2. 一步步创建Qt Widget项目+TextFinder案例(摘自笔者2015年将出的《QT5权威指南》,本文为试读篇)
  3. 1QPushButton的使用,QLineEdit的使用,设置组件位置,布局(QHBoxLayout,QGridLayout)
  4. 6.非关系型数据库(Nosql)之mongodb:集群(主从复制)
  5. ContextLoaderListener的用途以及配置方式
  6. BeautifulSoup children descendants对比
  7. 关于Ubuntu16.04下安装VMwareTools失败,未发现软件包open-vm-dkms,open-vm-tools问题解决
  8. Navicat 安装+连接
  9. Apache Jserv protocol
  10. 4.13 apache用户认证,跳转和访问日志