MySQL的一系列锁

关于Mysql中的锁的一些学习

锁的类型

共享锁

共享锁,也称为读锁,当一个事务对某一数据对象加上共享锁后,其他事务可以对该数据对象加共享锁,但不能加排他锁。

排他锁

排他锁,也称为写锁,当一个事务对某一数据对象加上排他锁后,其他事务不能再对该数据对象加任何其他类型的锁,直到持有排他锁的事务释放锁为止。

意向锁

意向锁是为了实现多粒度锁定(例如表锁和行锁的混合使用)而引入的一种锁,用于表示一个事务即将或已经在更细粒度的对象上加锁。意向锁分为意向共享锁(Intention Shared Lock,IS锁)和意向排他锁(Intention Exclusive Lock,IX锁)。

意向锁通常加在表级别,用于指示在表的某些行上已经加上了共享锁或排他锁,从而避免其他事务直接对表加锁时产生冲突。

  • 意向共享锁(IS锁):表示事务打算对某些行加共享锁,在加表级共享锁前必须先加表级意向共享锁。

  • 意向排他锁(IX锁):表示事务打算对某些行加排他锁,在加表级排他锁前必须先加表级意向排他锁。

锁算法

Record Lock

锁定单条记录。这种锁只会锁定行本身,而不会影响它前后的“间隙”。

解决了update、delete的可重复读问题。

Gap Lock

锁定记录之间的间隙,而不是实际的记录。通过锁定这些间隙,可以防止其他事务在这些间隙中插入新记录。

Next-Key Lock

是Record Lock 和 Gap Lock的组合,不仅锁定了某条记录本身,还锁定了这条记录与前一条记录之间的间隙。

解决了insert的可重复读问题。

select的可重复读由MVCC解决,通过快照

  • 系统版本号:是一个递增的数字,每开始一个新的事务,系统版本号就会自动递增。

  • 事务版本号:事务开始时的系统版本号。

  • 创建版本号:指示创建一个数据行的快照时的系统版本号;

  • 删除版本号:如果该快照的删除版本号大于当前事务版本号表示该快照有效,否则表示该快照已经被删除了。


Comment