mysql怎么找二叉树 mysql查询树形结构( 六 )


锁分类
MySQL支持三种层级的锁定 , 分别为
表级锁定
MySQL中锁定粒度最大的一种锁,最常使用的MYISAM与INNODB都支持表级锁定 。
页级锁定
是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁,表级锁速度快,但冲突多 , 行级冲突少,但速度慢 。所以取了折衷的页级,一次锁定相邻的一组记录 。
行级锁定
Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁 。行级锁能大大减少数据库操作的冲突 。其加锁粒度最小 , 但加锁的开销也最大行级锁不一定比表级锁要好:锁的粒度越细,代价越高,相比表级锁在表的头部直接加锁 , 行级锁还要扫描找到对应的行对其上锁,这样的代价其实是比较高的,所以表锁和行锁各有所长 。
MyISAM中的锁
虽然MySQL支持表,页,行三级锁定,但MyISAM存储引擎只支持表锁 。所以MyISAM的加锁相对比较开销低 , 但数据操作的并发性能相对就不高 。但如果写操作都是尾插入 , 那还是可以支持一定程度的读写并发
从MyISAM所支持的锁中也可以看出,MyISAM是一个支持读读并发,但不支持通用读写并发,写写并发的数据库引擎 , 所以它更适合用于读多写少的应用场合,一般工程中也用的较少 。
InnoDB中的锁
该模式下支持的锁实在是太多了,具体如下:
共享锁和排他锁 (Shared and Exclusive Locks)
意向锁(Intention Locks)
记录锁(Record Locks)
间隙锁(Gap Locks)
临键锁 (Next-Key Locks)
插入意向锁(Insert Intention Locks)
主键自增锁 (AUTO-INC Locks)
空间索引断言锁(Predicate Locks for Spatial Indexes)
举个栗子,比如行锁里的共享锁跟排它锁:lock in share modle 共享读锁:
为了确保自己查到的数据没有被其他的事务正在修改,也就是说确保查到的数据是最新的数据 , 并且不允许其他人来修改数据 。但是自己不一定能够修改数据,因为有可能其他的事务也对这些数据使用了 in share mode 的方式上了S 锁 。如果不及时的commit 或者rollback 也可能会造成大量的事务等待 。
for update排它写锁:
为了让自己查到的数据确保是最新数据 , 并且查到后的数据只允许自己来修改的时候,需要用到for update 。相当于一个 update 语句 。在业务繁忙的情况下 , 如果事务没有及时的commit或者rollback 可能会造成其他事务长时间的等待,从而影响数据库的并发使用效率 。
Gap Lock间隙锁:
1、行锁只能锁住行,如果在记录之间的间隙插入数据就无法解决了,因此MySQL引入了间隙锁(Gap Lock) 。间隙锁是左右开区间 。间隙锁之间不会冲突 。
2、间隙锁和行锁合称NextKeyLock,每个NextKeyLock是前开后闭区间 。
间隙锁加锁原则(学完忘那种):
1、加锁的基本单位是 NextKeyLock , 是前开后闭区间 。
2、查找过程中访问到的对象才会加锁 。
3、索引上的等值查询,给唯一索引加锁的时候,NextKeyLock退化为行锁 。
4、索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,NextKeyLock退化为间隙锁 。
5、唯一索引上的范围查询会访问到不满足条件的第一个值为止 。
MySQL——关于索引的总结 首先说说索引的 优点 :最大的好处无疑就是提高查询效率 。有的索引还能保证数据的唯一性 , 比如唯一索引 。
而它的 坏处 也很明显:索引也是文件,我们在创建索引时 , 也会创建额外的文件,所以会占用一些硬盘空间 。其次 , 索引也需要维护,我们在增加删除数据的时候 , 索引也需要去变化维护 。当一个表的索引多了以后,资源消耗是很大的,所以必须结合实际业务再去确定给哪些列加索引 。

推荐阅读