1、锁的介绍
- 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)
- 在mysql中,除传统的计算资源如CPU、RAM、I/O等的争用外,数据也是一种供许多用户共享的资源,如何保证数据并发访问的一致性,有效性是数据库必须解决的问题,锁冲突也是影响数据库并发访问性能的一个重要因素
2、锁的分类
2.1、从对数据操作的力度分类:
- 表锁:操作时会锁定整个表
- 行锁:操作时锁定当前行
2.2、从对数据操作的类型分类:
- 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
- 写锁(排他锁):当前操作没有完成之前,它会阻断其他的写锁和读锁
3、mysql存储引擎对锁的支持
存储引擎 | 表级锁 | 行级锁 |
---|---|---|
myISAM | 支持 | 不支持 |
innoDB | 支持 | 支持 |
memory | 支持 | 不支持 |
BDB | 支持 | 不支持 |
4、锁的特性
-
表级锁:
– 偏向myISAM,开销小,加锁快,不会出现死锁
– 锁定力度大,发生冲突的概率最高,并发度最低
-
行级锁:
– 偏向innoDB,开销大,加锁慢,会出现死锁
– 锁定力度小,发生冲突概率最低,并发度也最高
5、表级锁
-
myISAM存储引擎只支持表级锁
– myISAM在执行select前会自动给涉及的所有表加读锁
– myISAM在执行update、delete、insert等前,会自动给涉及的表加写锁
– 所以用户一般不需要直接使用lock table命令给myISAM表显式加锁
-
语法
lock table table_name read; --加读锁 lock table table_name write; --加写锁
6、行锁
-
innoDB实现了两种类型的行锁
– 读锁:又称共享锁(s),简称(s)锁,读锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但只能读不能写
– 写锁:又称排它锁(x),简称(x)锁,写锁就是不能与其他锁并存,如一个事务获取了一个数据行的写锁,其他事务就不能再获取该行的其他锁,包括读锁和写锁,但获取写锁的事务可以对该行数据读取和修改。
-
对于update、delete、insert语句,innoDB会自动给涉及的数据加写锁(x)
-
对于select语句,innoDB不会加任何锁
-
语法
select * from table_name where ... lock in share mode; --共享锁 select * from table_name where ... for update; --排他锁