mysql 索引 锁 隔离级别

平衡二叉树,就是每个节点左右两边的差距不能超过1,(高度不能超过1)

索引其实和表数据不是一一对应的,只是方便理解看着一一对应而已,它其实存储的是关键字,指向数据的指针

 

MyISAM锁机制查询的时候会加读锁,修改数据的时候加写锁,在加读锁的时候不能进行写锁,当加写锁的时候不能进行读锁,当加读锁的时候可以进行读.

但加了排他锁的时候读的时候也不能进行读了

MyISAM是表级锁,对表进行上锁,InnoDB可以对表上锁,也可以对行进行上锁.

InnoDB的select是不加锁的,需要手动加共享锁,它只是针对这一行.修改别的行不会加锁的.

如果两个都是读操作的话,就算加了共享锁也没关系,依然能读取到数据.

当操作的不是索引字段的时候,会建立表级锁,当查询修改的是索引字段的时候会走行级锁

增删改操作多的使用InnoDB要求事务的,可靠性要求高也使用它

查询频率高,对count频率高,增删改少没有事务使用MyISAM

数据库四大特性(ACID)

原子性:数据要么都成功,要么都失败

一致性:比如银行转账无论怎么转钱不能多了或者少了

隔离性:在多个事务之间,事务和事务之间不能相互影响.

持久性:数据一旦提交就得永久的保存到数据库中持久化.

事务隔离级别  read uncommitted<read committed<repeatable-read<serializable

mysql默认是repeatable-read 可以保证脏读不可重复读

隔离级别越高就会进行串行化,就会都加上锁,性能越差,所以需要根据业务的需求来设置隔离级别

脏读:一个事务可以读取到另一个事务未提交的数据 read committed这个隔离级别可以解决这个问题

加上这个隔离级别后,第一个事务就读取不到另一个事务未提交的数据了

不可重复读:事务A多次读取数据 ,事务B在A读取的过程中修改了这个数据,导致A多次读取的数据不一致   当A第一次读取数据时是1000,然后B事务修改了这个数据,然后A又读取了一次发现数据变了..A并不知道别人操作了这个数据所以很不可靠感觉这个数据.  repeatable-read 

当加上repeatable-read 这个隔离级别后,A第一次读取1600,B进行修改然后提交,A事务再读取,还是1600,但是当A进行修改-100的话,再查询,得到的结果是1900.这样就保证了数据的一致性.

幻读:当事务A查询表的时候有三条记录,然后B事务进行插入一条数据,提交了,但是A事务不知道,这时它修改所有数据值为1000,这时发现他修改了4条数据,这就是幻读.

但是当创建表的锁为InnoDB的时候,并且它的隔离级别为repeatable-read时,它默认是行级锁,但是B事务还是插入不进去的.这种情况是不会发生的.

但是当隔离级别改为read committed的时候,幻读就会发生

当隔离级别改为serializable的时候就会避免幻读的发生,在插入的时候就会加上锁来避免

lock in share mode 共享锁   select for update  排它锁   其余的就是快照读,快照度有可能读取到旧的版本

猜你喜欢

转载自blog.csdn.net/kxj19980524/article/details/88406807