打个比方,我们到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买,那么如何解决是你买到还是另一个人买到的问题?
这里肯定要用到事务,我们先从库存表中取出物品数量,然后插入订单,付款后插入付款表信息,然后更新商品数量。在这个过程中,使用锁可以对有限的资源进行保护,解决隔离和并发的矛盾。
偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
建表语句:
CREATE TABLE mylock ( id INT NOT NULL PRIMARY KEY auto_increment, NAME VARCHAR ( 20 )) ENGINE myisam; INSERT INTO mylock ( NAME ) VALUES ( 'a' ); INSERT INTO mylock ( NAME ) VALUES ( 'b' ); INSERT INTO mylock ( NAME ) VALUES ( 'c' ); INSERT INTO mylock ( NAME ) VALUES ( 'd' ); INSERT INTO mylock ( NAME ) VALUES ( 'e' );手动增加表锁
LOCK TABLE 表名字 1 READ ( WRITE ),表名字 2 READ ( WRITE ),其它;查看哪些表被加锁了
SHOW OPEN TABLES;查看哪些表被加锁了
SHOW OPEN TABLES WHERE in_use >0;查询指定数据库指定表是否被加锁
SHOW OPEN TABLES FROM db2020 WHERE `table` = '表名';增加锁的sql语句: 给mylock表上一个读锁,book表上一个写锁
Lock table mylock read,book write
结论: 结合上表,所以对MyISAM表进行操作,会有以下情况:
对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。 简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞通过SQLSHOW STATUS LIKE 'table%'检查Table_locks_immediate和Table_locks_waited状态变量来分析系统上的表锁定 通过Table_locks_immediate和Table_locks_waited状态变量记录MySQL内部表级锁定情况,变量如下:
Table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在较严重表级锁的争用情况 此外Myisam的读写锁调度是写优先,这也是Myisam不适合做 写为主的 表的引擎。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永久堵塞,这也Myisam要让他偏读,不让他偏写的原因