MySQL锁的用法之行级锁
来源:互联网 发布:电磁场仿真软件 编辑:程序博客网 时间:2024/06/06 00:33
INNODB的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种。共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改。排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录。
共享锁:
用法: SELECT ... LOCK IN SHARE MODE;
MySQL会对查询结果集中每行都添加共享锁。
锁申请前提:当前没有线程对该结果集中的任何行使用排他锁,否则申请会阻塞。
操作限制:使用共享锁线程与不使用共享锁线程对锁定记录操作限制表
1. 使用共享锁线程可对其锁定记录进行读取,其他线程同样也可对锁定记录进行读取操作,并且这两个线程读取的数据都属于同一个版本。
2. 对于写入操作,使用共享锁的线程需要分情况讨论,当只有当前线程对指定记录使用共享锁时,线程是可对该记录进行写入操作(包括更新与删除),这是由于在写入操作前,线程向该记录申请了排他锁,然后才进行写入操作;当其他线程也对该记录使用共享锁时,则不可进行写入操作,系统会有报错提示。不对锁定记录使用共享锁的线程,当然是不可进行写入操作了,写入操作会阻塞。
3. 使用共享锁进程可再次对锁定记录申请共享锁,系统并不报错,但是操作本身并没有太大意义。其他线程同样也可以对锁定记录申请共享锁。
4. 使用共享锁进程可对其锁定记录申请排他锁;而其他进程是不可以对锁定记录申请排他锁,申请会阻塞。
排他锁:
用法: SELECT ... FOR UPDATE;
MySQL会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。
锁申请前提:当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。
操作限制:
使用排他锁线程与不使用排他锁线程对锁定记录操作限制表
1. 使用排他锁线程可以对其锁定记录进行读取,读取的内容为当前事物的最新版本;而对于不使用排他锁的线程,同样是可以进行读取操作,这种特性是一致性非锁定读。即对于同一条记录,数据库记录多个版本,在事物内的更新操作会反映到新版本中,而旧版本会提供给其他线程进行读取操作。
2. 使用排他锁线程可对其锁定记录进行写入操作;对于不使用排他锁的线程,对锁定记录的写操作是不允许的,请求会阻塞。
3. 使用排他锁进程可对其锁定记录申请共享锁,但是申请共享锁之后,线程并不会释放原先的排他锁,因此该记录对外表现出排他锁的性质;其他线程是不可对已锁定记录申请共享锁,请求会阻塞。
4. 使用排他锁进程可对其锁定记录申请排他锁(实际上并没有任何意义);而其他进程是不可对锁定记录申请排他锁,申请会阻塞。
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之行级锁
- MySQL锁的用法之表级锁
- MySQL锁的用法之表级锁
- MySQL之主键的用法
- MySQL之IN的用法
- Mysql 之MySQL用户变量的用法
- MySQL锁的用法
- MySQL 之update 语句的正确用法
- 简单扑克牌比较游戏ava集合框架实践
- 解决xpath定位,获取某个子节点中的某个孩子节点或者文本
- Postgres间隔大量写IO的解决办法
- Shotcut(视频剪辑软件)官方正式版V17.12下载 | shotcut使用教程
- C#微信开放平台开发——1、序言
- MySQL锁的用法之行级锁
- Generic Method in Java with Map
- WIZnet嵌入式以太网技术培训公开课(免费!!!)
- 前端fabric.js实现二叉树可视化布局
- R语言-RStudio打开中文注释的脚本后出现乱码
- matlab对文件目录路径的操作
- mybatis查询时间段sql语句
- 找不到包含 OwinStartupAttribute 的程序集
- BSD许可证