表锁简介

锁分为表锁和行锁:

表锁开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度低。

行锁开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

不同的存储引擎支持的锁粒度不一样。InnoDB行锁和表锁都支持,MyISAM只支持表锁。InnoDB只有通过索引条件检索数据才使用行级锁,否则,InnoDB将使用表锁。InnoDB的行锁是基于索引的。

表锁的模式:表读锁(table Read Lock)、表写锁(table WriteLock)

请求锁模式是否兼容当前锁模式

None

读锁

写锁

读锁

写锁

在表读锁和表写锁的环境下:读读不阻塞,读写阻塞,写写阻塞。

  • 读读不阻塞:当前用户在读数据,其他用户也在读数据,不会加锁。
  • 读写阻塞:当前用户在读数据,其他用户不能修改当前用户读的数据,会加锁。
  • 写写阻塞:当前用户在修改数据,其他的用户不能修改当前用户正在修改的数据,会加锁。

读锁和写锁是互斥的,读写操作是串行。如果某个进程想要获取读锁,同时另一个经常想要获取写锁,MySQL中写锁是优先于读锁的。

写锁和读锁的优先级可以通过参数调节的:max_write_lock_count和low_priority_update。需要注意:

  • LOCAL修饰符允许其他会话在持有锁时执行非冲突的插入语句(并发插入)。但是如果打算在持有锁时使用服务器外部的进程操作数据库,则不能使用READ LOCAL。对于InnoDB表,READ LOCAL和READ是一样的。
  • MyISAM可以支持查询和插入操作的并发进行,可以通过系统变量concurrent_insert来指定哪种模式,在MyISAM中它默认是:如果MySIAM表中没有空洞(表中没有被删除的行),MySIAM允许在一个进程读表的同时,另一个进程从表尾插入记录。InnoDB存储引擎是不支持这个的。
欢迎批评指正,提出问题,谢谢!
原文地址:https://www.cnblogs.com/xxeleanor/p/14369489.html