# 锁
锁机制可以用于控制并管理对并发资源的访问。数据库系统中使用锁是为了支持对共享资源进行并发访问,并保证数据的完整性和一致性。
**Mysql中的锁策略**
锁策略:寻求一种在锁开销(加锁,解锁,争夺锁)和数据安全性维持平衡的一种策略。锁策略属于`存储引擎层`,不同的存储引擎可以支持不同的锁策略。
1. 表锁 table lock
表锁是mysql中最基本也是开销最小的策略,当有写者线程(进行插入,删除,修改操作)的时候锁定整张表,其他读线程和写线程都不能操作这张表,阻塞等待。读锁之间不阻塞。-- `写者优先`。
虽然不同的存储引擎可以实现不同的锁策略,例如有些存储引擎只支持行锁,但是mysql服务器仍然会对一些语句例如Alter table使用表锁,而忽略存储引擎的锁机制。
表锁是一种非常粗糙的锁机制,严重影响系统的`吞吐量`。
MYISAM存储引擎实现的就是表锁。
2. 行级锁 row lock
可以最大程度的支持并发处理,同时也带来了最大的锁开销。Innodb实现了行级锁,在InnoDB中实现了两种标准的行级锁:
* S Lock共享锁:允许事务读一行数据。
* X Lock排他锁:允许事务删除或更新一行数据。
![](https://img.kancloud.cn/1e/a4/1ea424f7137c871c33dcbc131d46ff6d_823x145.png)
~~~
这里的兼容性指的是对于同一行记录而言,对于不同行记录之间不会有影响。
~~~
3. 意向锁 Intention Lock:将锁定的对象分为多个层次,意向锁意味着事务希望在更细粒度上进行加锁。
* 意向共享锁 IS Lock:事务想要获得某几行的共享锁。
* 意向排他锁 IX Lock:事务想要获得某几行的排他锁。
## 一致性非锁定读
Consistent Nonlocking Read,通过多版本并发控制(MVCC)的方式读取当前执行时间数据库中的行的数据,如果读取的行在执行delete或者update操作,`不需要等到锁的释放`再去读取,而是直接读取行的快照数据。
通过undo段实现的非锁定读机制可以极大的提高并发性,是InnoDB的默认行为,但是并不是所有的隔离级别都会采用。
* Read Committed:会读取最新的快照数据。
* Repeatable Read:读取事务开始时的快照数据。
## 锁的算法
行锁的三种算法:
1. Record Lock:单个记录上锁
2. Gap Lock:间隙锁:锁定一个范围,不包含记录本身
3. Next-Key Lock:记录锁+间隙锁,锁定一个范围,并且包含记录本身。
- 第一章 Java基础
- ThreadLocal
- Java异常体系
- Java集合框架
- List接口及其实现类
- Queue接口及其实现类
- Set接口及其实现类
- Map接口及其实现类
- JDK1.8新特性
- Lambda表达式
- 常用函数式接口
- stream流
- 面试
- 第二章 Java虚拟机
- 第一节、运行时数据区
- 第二节、垃圾回收
- 第三节、类加载机制
- 第四节、类文件与字节码指令
- 第五节、语法糖
- 第六节、运行期优化
- 面试常见问题
- 第三章 并发编程
- 第一节、Java中的线程
- 第二节、Java中的锁
- 第三节、线程池
- 第四节、并发工具类
- AQS
- 第四章 网络编程
- WebSocket协议
- Netty
- Netty入门
- Netty-自定义协议
- 面试题
- IO
- 网络IO模型
- 第五章 操作系统
- IO
- 文件系统的相关概念
- Java几种文件读写方式性能对比
- Socket
- 内存管理
- 进程、线程、协程
- IO模型的演化过程
- 第六章 计算机网络
- 第七章 消息队列
- RabbitMQ
- 第八章 开发框架
- Spring
- Spring事务
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 数据库
- Mysql
- Mysql中的索引
- Mysql中的锁
- 面试常见问题
- Mysql中的日志
- InnoDB存储引擎
- 事务
- Redis
- redis的数据类型
- redis数据结构
- Redis主从复制
- 哨兵模式
- 面试题
- Spring Boot整合Lettuce+Redisson实现布隆过滤器
- 集群
- Redis网络IO模型
- 第十章 设计模式
- 设计模式-七大原则
- 设计模式-单例模式
- 设计模式-备忘录模式
- 设计模式-原型模式
- 设计模式-责任链模式
- 设计模式-过滤模式
- 设计模式-观察者模式
- 设计模式-工厂方法模式
- 设计模式-抽象工厂模式
- 设计模式-代理模式
- 第十一章 后端开发常用工具、库
- Docker
- Docker安装Mysql
- 第十二章 中间件
- ZooKeeper