表锁开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度低。
行锁开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
不同的存储引擎支持的锁粒度不一样。InnoDB行锁和表锁都支持,MyISAM只支持表锁。InnoDB只有通过索引条件检索数据才使用行级锁,否则,InnoDB将使用表锁。InnoDB的行锁是基于索引的。
表锁的模式:表读锁(table Read Lock)、表写锁(table WriteLock)
请求锁模式是否兼容当前锁模式 |
None |
读锁 |
写锁 |
读锁 |
是 |
是 |
否 |
写锁 |
是 |
否 |
否 |
在表读锁和表写锁的环境下:读读不阻塞,读写阻塞,写写阻塞。
读锁和写锁是互斥的,读写操作是串行。如果某个进程想要获取读锁,同时另一个经常想要获取写锁,MySQL中写锁是优先于读锁的。
写锁和读锁的优先级可以通过参数调节的:max_write_lock_count和low_priority_update。需要注意:
原文:https://www.cnblogs.com/xxeleanor/p/14369489.html