mysql-锁机制
是什么?
计算机是一套多个进程或县城并发访问某一资源的机制。
表锁(偏读)
偏向MyISAM存储引擎,开销小,加锁快;无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。
lock table 表名 read,表名 write;
【查看哪些表被锁了】1表示锁定
show open tables;
【释放表锁】
unlock tables;
【看看哪些表被锁了】
show open tables;
【如何分析表锁定】
可以通过检查table_locks_waitd和table_locksimmediate状态变量来分析系统上的表所定。
show status like 'table%';
table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,没立即获取锁值加1;
table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,没等待一次锁值增加1),此值高则说明存在着较严重的表级锁争用情况;
myisam的读写锁调度是写优先,这也是mysiam不适合做主表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。
获得表的READ锁定,当前session可以查询该表记录,当前session不能查询其他没有锁定的表;
其他session也可以查询该表,其他session可以查询或者更新未锁定的表,但是不能更新锁定的表,会造成阻塞,释放锁后才会执行操作。
锁定后,当前session不能查询其他表,其他session查询该表的时候会阻塞。
行锁(偏写)
偏向InnoDB存储引擎,开销大,加锁;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也是最高。
InnoDB与MyISAM的最大不同有两点:一是支持事务;二是采用了行级锁
结论,看图
读锁会阻塞写,但是不会阻塞读;而写锁则会把写和读都阻塞。