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锁) 某些情况会对效率产生严重损害