# 鎖
鎖機制可以用于控制并管理對并發資源的訪問。數據庫系統中使用鎖是為了支持對共享資源進行并發訪問,并保證數據的完整性和一致性。
**Mysql中的鎖策略**
鎖策略:尋求一種在鎖開銷(加鎖,解鎖,爭奪鎖)和數據安全性維持平衡的一種策略。鎖策略屬于`存儲引擎層`,不同的存儲引擎可以支持不同的鎖策略。
1. 表鎖 table lock
表鎖是mysql中最基本也是開銷最小的策略,當有寫者線程(進行插入,刪除,修改操作)的時候鎖定整張表,其他讀線程和寫線程都不能操作這張表,阻塞等待。讀鎖之間不阻塞。-- `寫者優先`。
雖然不同的存儲引擎可以實現不同的鎖策略,例如有些存儲引擎只支持行鎖,但是mysql服務器仍然會對一些語句例如Alter table使用表鎖,而忽略存儲引擎的鎖機制。
表鎖是一種非常粗糙的鎖機制,嚴重影響系統的`吞吐量`。
MYISAM存儲引擎實現的就是表鎖。
2. 行級鎖 row lock
可以最大程度的支持并發處理,同時也帶來了最大的鎖開銷。Innodb實現了行級鎖,在InnoDB中實現了兩種標準的行級鎖:
* S Lock共享鎖:允許事務讀一行數據。
* X Lock排他鎖:允許事務刪除或更新一行數據。

~~~
?這里的兼容性指的是對于同一行記錄而言,對于不同行記錄之間不會有影響。
~~~
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