概念
锁是计算机协调多个进程或线程并发访问某一资源的机制。
在数据库中,除传统的计算资源(cpu、ram、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤为重要,也更加复杂。
案例
锁的分类
- 按照对数据的操作类型分为:读锁、写锁;
- 按照对数据的操作粒度分为:表锁、行锁。
读锁
又称为共享锁,针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁
又称为排他锁,当前写操作没有完成前,它会阻断其他写锁和读锁。
三锁
- 表锁(偏读)
特点
偏向于MyISAM存储引擎,开销小,加锁快;锁定粒度大,发生锁冲突的概率最高,并发度最低。
案例分析
# 表级锁分析
create table if not exists mylock(
id int not null primary key auto_increment,
name varchar(20)
)engine myisam;
insert into mylock(name) values
('a'),('b'),('c'),('d'),('e');
select * from mylock;
手动增加表锁:
格式:lock table 表名字 read(write),表名字2 read(write),其他;
查看当前有锁的表:show open tables
加锁
# 一个上读锁,一个上写锁
lock table mylock read,book write;
解锁
unlock tables;
mylock添加read锁(读阻塞写例子)
1、读锁是可以共享的。
2、读锁是不可以进行自我修改操作的,同时其他session会发生阻塞排队现象。
3、未解锁之前也不能读其他表,其他session不受影响。
mylock添加write锁(写阻塞读例子)
1、自己可以读自己的表,也不一样更新自己的表,还是不能读其他表
2、其他session可以读未加锁的表;
3、其他session读发生阻塞;
总结:
分析:
Myisam的读写锁调度是写优先,这也是Myisam不适合做写为主表的引擎。以为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永久的阻塞。因此,表锁偏读的原因,适合淘宝的买家而不是卖家,多用于查询。
-
行锁(偏写)
-
页锁(了解)