以下内容源自mysql技术内幕这本书中的知识点
1. 什么是锁:
1.2 lock与latch
lock与latch的比较:
1.3 innodb存储引擎锁的类型:
行级锁:
表级锁:
2. 一致性非锁定读和一致性锁定读:
2.1 一致性非锁定读:
简而言之就是,读的是快照(MVCC)不需要加锁,性能提高非常大
2.2 一致性锁定读:
在默认配置下,即事物的隔离级别为REPEATABLE READ模式下,InnoDB存储引擎的SELECT操作使用一致性非锁定读。但是在某些情况下,用户需要显示地对数据库读取操作进行加锁以保证数据逻辑的一致性。而这要求数据库支持加锁语句,即使是对于SELECT的只读操作。InnoDB存储引擎对于SELECT语句支持两种一致性的锁定读(locking read)操作:
- SELECT ... FOR UPDATE
- SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE对读取的行记录加一个X锁,其他事物不能对已锁定的行加上任何锁。SELECT ... LOCK IN SHARE MODE对读取的行记录加一个S锁,其他事物可以向被锁定的行加S锁,但是如果加X锁,则会被阻塞。对于一致性非锁定读,即使读取的行已被执行了SELECT ... FOR UPDATE,也是可以进行读取的。
3. 锁的算法
3.1 行锁的三种算法
Record Lock: 单个行记录加锁
Gap Lock: 间隙锁,锁定一个范围,但不包含记录本身
Next-Key Lock: Gap Lock+Record Lock,锁定一个范围,且锁定记录本身
4. 锁的问题:\
4.1 脏读
脏读就是指在不同的事务下,当前事务可以读到另外事务未提交的数据,这违背了事务ACID特性的I(隔离性)
4.2 不可重复读
【tip:第二个事务的修改已经提交了】
不可重读读和脏读的区别:脏读是读到事务未提交的数据,而不可能重读读是读到已提交的数据,违反了事务ACID特性的C(一致性)
4.3 丢失更新