为什么要用锁?
你在试衣间试衣服,没有锁,别人就会推门进来,场面会很尴尬!!!
什么是锁?
- 锁是计算机协调多个进程或线程并发访问某一资源的机制;
- 在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素;
- 锁对数据库而言显得尤其重要,也更加复杂。
Mysql 中的锁?
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
- 页锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
锁的使用场景?
- 表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,可以考虑使用MyISAM锁;
- 行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,可以考虑使用InnoDB锁.
MyISAM 锁-- 表级锁
MySQL 的表级锁有两种模式:
- 表共享读锁(Table Read Lock)
- 表独占写锁(Table Write Lock)
None(无锁时) | 读锁 | 写锁 | |
读锁 | 是 | 是 | 否 |
写锁 | 是 | 否 | 否 |
读锁 | 写锁 | |
同session | 读当前被锁表:可读 读当前被锁表别名表: 报错 写当前被锁表:报错 读其他表:报错 写其他表:报错 | 读当前被锁表:报错 读当前被锁表别名表: 报错 写当前被锁表:可写 读其他表:报错 写其他表:报错 |
不同session | 读当前被锁表:可读 写当前被锁表:等待 读其他表:可读 写其他表:可写 | 读当前被锁表:等待 写当前被锁表:等待 读其他表:可读 写其他表:可写 |
InnoDB 锁--行级锁
注:必须有索引才能实现,否则会自动锁全表!!!
读锁 | 写锁 | |
同session | 可读 可写 | id= 1加写锁 |
不同session | 可读 | 允许读 写id= 1的数据,等待 写id != 1的数据,可写 写 非索引列查询条件数据,等待 |
加锁 | 可加读锁 | 不可加任何锁 |
如何释放锁?
执行Begin,commit,或者rollback