myisam 索引记录的是数据地址,一定程度上可以直接拿去数据
innodb 索引记录的是主键,需要回表查询
======================
支持事务,采用行级锁
表锁(myisam偏多)
读锁(共享锁):当前用户仅能读当前表,不能修改,不能读其他表;其他用户修改阻塞等待,性能降低,读自由
写锁(排他锁):当前写操作没有完成前,其他都不能操作,当前可以增删查
简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁则会把读和写都堵塞。
show open tables 哪些锁被加锁了, 1为加锁
lock table mylock read;给mylock加读锁
unlock tables;解锁
update mylocl set name ='a2' where id=1
lock table mylock write; 写锁
show status like 'table%';
行锁(偏向innodb):
事务ASID:原子性,一致性,隔离性,持久性
事务产生的四大问题
1.更新丢失
2.脏读:读到已修改尚未提交的数据
3.不可重复读:事务a读取到事务b已经提交的修改的数据,不符合隔离性
4.幻读:读到新增数据
3和4的区别在于产生幻读在于没办法控制Insert语句,而3也会产生4。
解决方案
1.未提交读:解决1
2.已提交读:解决1.2
3.可重复读:解决1.2.3
4.可序列化读:解决1.2.3.4
行级锁的操作
数据库底层使用线程加版本号的形式控制锁
CAS:compare and swap
和
CAP:一致性,可用性,分区容错性
区分开
间隙锁
当我们用范围条件而不是相等条件检索数据,并请求共享 或排他锁时,innodb会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙GAP”
innodb也会对这个“间隙”加索,这种锁机制就是所谓的间隙表(next-key锁)
某些情况会对效率产生严重损害