表锁&行锁

行锁

InnoDB 实现了以下两种类型的行锁

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

  • 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

锁的分类

全局锁

备份

行锁

锁定一行数据,即上面所说的共享锁和排他锁

InnoDB是基于索引来完成行锁

行锁的模式

锁的模式有:共享锁,排他锁,意向共享锁,意向排他锁

共享锁

共享锁又称读锁 (read lock),是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。当如果事务对读锁进行修改操作,很可能会造成死锁。如下图所示。

排它锁

排他锁 exclusive lock(也叫writer lock)又称写锁。 名词解释:若某个事物对某一行加上了排他锁,只能这个事务对其进行读写,在此事务结束之前,其他事务不能对其进行加任何锁,其他进程可以读取,不能进行写操作,需等待其释放。 排它锁是悲观锁的一种实现,在上面悲观锁也介绍过。

意向共享锁(IS):

事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。

意向排他锁(IX):

事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

锁的应用

insert 插入记录时,需要获取行锁

update 更新一条记录时,如果记录存在,需要行锁;如果记录不存在,行锁 + 间隙锁

delete 删除一条记录时,如果记录存在,需要行锁;如果记录不存在,行锁 + 间隙锁

select 查询记录时,不会存在锁,除非显示的调用lock in share mode或者for update,如下所示。为什么查询不存在锁呢?因为InnoDB引擎select查询返回的是数据的快照版本,这也是为什么在许多mysql书中,事务的select查询需要锁时,要显示的使用加锁语法。参见MySQL查询不需要锁,了解更多有关InnoDB查询的机制。

Last updated