mysql优化 -- 锁(Myisam)

锁的概念

锁是计算机协调多个进程或者线程并发访问某一资源的机制。

在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

锁对数据库而言显得尤其重要,也更加复杂。

MySQL中的锁

mysql的锁机制比较简单

最显著的特点是不同的存储引擎支持不同的锁机制

比如:

Myisam和memory存储引擎采用的是表级锁;

InnoDb存储引擎既支持行级锁,也支持表级锁,但默认条件下是采用行级锁。

 

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发送锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概念最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

 

从锁的角度来说:

表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如OLAP系统。

行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

MyIsam的表锁

mysql的表级锁有两种模式:

表共享读锁(Table Read Lock)

表独占写锁(Table Write Lock)

mysql优化 -- 锁(Myisam)_第1张图片

MyIsam的表锁-共享读锁

语法:lock table 表名 read

UNLOCK TABLES; 解锁

lock table  myisamlock READ

  1. 同一个session和不同的session都可以select * from  myisamlock
  2. 同一个session  insert和update都报错,
  3. 不同的session等待:insert into myisamlock value(2);
  4. 同一个session里,对其他表操作报错
  5. 在不同的session里,对其他表操作正常
  6. 加索在同一个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,但对其他表进行操作会报错

 

你可能感兴趣的:(mysql)