说实话,计算机这些理论概念,不直接进行操作,还真是不好理解,不好记忆。
表级锁:
1,某线程A对表级锁加上读锁(Share Lock)之后,A线程只能读该表,不能读其他表,更不可能修改任何表;而线程B也只能读取该表,除此之外,可以读取其他表,而想改动(update)该表陷入阻塞,改不了。
2,某线程A对表级锁加上写锁(Exclusive Lock)之后,A线程不仅可以读该表,写可以update该表,但是对其他表不能读写,而线程B对该表读会进入阻塞状态,更不用说写操作了。但是可以读写其他表
总结:(1)对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其他进程的写操作。(2)对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。
MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎。因为写锁后,其他线程不做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。
行级锁:
1,什么是间隙锁:当我们用范围条件而不是相等条件检索数据,并请求共享或者排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做间隙“Gap” InnoDB也会对这个间隙加锁,这种锁机制就是所谓的间隙锁(Next-key)锁。
2,危害:间隙锁有一个致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入键值范围内的任何数据,在某些场景下这可能会对性能造成很大的危害。
3,锁定某一行语法,锁定第八行,其他线程不能操作,进入阻塞状态。
行锁总结
InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定的会更高一些,但是在整体并发处理能力方面要远远由于MyISAM的表级锁定,当系统的并发程度较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势,但是,InnoDB的行级锁定同样也有脆弱的一面,使用不当的时候,会适得其反。