锁的概念
锁是计算机协调多个进程或者线程并发访问某一资源的机制。
在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
锁对数据库而言显得尤其重要,也更加复杂。
MySQL中的锁
mysql的锁机制比较简单
最显著的特点是不同的存储引擎支持不同的锁机制
比如:
Myisam和memory存储引擎采用的是表级锁;
InnoDb存储引擎既支持行级锁,也支持表级锁,但默认条件下是采用行级锁。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发送锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概念最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
从锁的角度来说:
表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如OLAP系统。
行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。
MyIsam的表锁
mysql的表级锁有两种模式:
表共享读锁(Table Read Lock)
表独占写锁(Table Write Lock)
MyIsam的表锁-共享读锁
语法:lock table 表名 read
UNLOCK TABLES; 解锁
lock table myisamlock READ
- 同一个session和不同的session都可以select * from myisamlock
- 同一个session insert和update都报错,
- 不同的session等待:insert into myisamlock value(2);
- 同一个session里,对其他表操作报错
- 在不同的session里,对其他表操作正常
- 加索在同一个session 中 select s.* from testmysam s 报错lock table 表名 as 别名 read;
查看 show status LIKE 'table_locks_waited' 表被锁过几次
MyIsam的表锁-独占写锁
lock table 表名 write
1.lock table testmysam WRITE
在同一个session中
insert testmysam value(3);
delete from testmysam where id = 3
select * from testmysam
2.对不同的表操作(报错)
select s.* from testmysam s
insert into testdemo value(2,'2','3');
3.在其他session中 (等待)
select * from testmysam
Myisam表锁总结
对Myisam表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求
对Myisam表的读操作,不会阻塞当前session对表读的操作,但是对表进行修改会报错
一个session使用lock table 命令给表加了读锁,这个session可以查询锁定表中的记录,但是更新和访问其他表都会提示错误。
另外一个session可以查询表中的记录,但更新就会出现锁等待。
对Myisam表的写操作,会阻塞其他用户对同一个表的读和写操作
对Myisam表的写操作,当前session可以对当前表做CRUD,但对其他表进行操作会报错