mysql的学习
前言
本篇文章是我自己学会了的mysql的知识;我看到阿里面试的要求上有一句话,不仅要知其然,还要知其所以然;我现在努力先知其然吧。
mysql事务
事务的基本要素(ACID)
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
mysql的四个隔离级别以及锁
隔离级别是为了解决事务中会出现的问题,通过锁的形式来设置。
1、读未提交:完全没有加锁,A事务和B事务取同一条数据,B把数据改了,A就能查询到,可是B又回滚了,那么A读的就是脏数据,产生脏读。该级别忽略其它事务放置的锁
2、读提交(不可重复读):为了解决脏读,当B事务不提交,A事务就读取不到B改的数据,不会脏读。但是a事务读好几次,中间b事务提交把数改了,a事务再读和之前的就不一样了,就是不可重复读)。
加锁的时候,读已提交隔离级别不加间隙锁,这样就能允许并发的其他事务执行插入操作因而产生幻象现象,因为读已提交隔离级别是允许幻象异常存在的。
3、可重复度:在2的基础上,A事务前后读的数据是一致的。可是,当A事务把表里所有数据都改了,然后B再插入,A再查就幻读了。(mysql中默认是这个)。在当前事务提交之前。其它不论什么事务均不能够改动或删除当前事务已读取的数据。并发性低于 READ COMMITTED。已读数据的共享锁在整个事务期间持有,而不是在每一个语句结束时释放。这个隔离级别仅仅是说,不可以改动和删除,可是并没有强制不能插入新的满足条件查询的数据行
4、串行化(表级锁):直接加表级锁,就不能幻读了。读加共享锁。写加排他锁,读写相互排斥。使用的悲观锁的理论,实现简单,数据更加安全。可是并发能力非常差。假设你的业务并发的特别少或者没有并发,同一时候又要求数据及时可靠的话,能够使用这样的模式。
幻读:A事务把表的一列全改了,之后b事务插入了一条数据,然后a事务再读表,发现自己明明全改了,怎么有一条不一样呢。幻读侧重于插入和删除。
对于锁的理解还是不太清楚。涉及悲观锁、乐观锁;行级锁、表级锁。
mysql行级锁:
1、在执行查询语句(select)前,会自动给涉及的所有表加读锁在执行更新操作;
2、(update、delete、insert等)前,会自动给涉及的表加写锁。这个过程并不需要用户干预。
3、共享锁(S):SELECT * FROM table_name WHERE LOCK IN SHARE MODE
排他锁(X) :SELECT * FROM table_name WHERE … FOR UPDATE
4、哎呀,项目里用不到,硬去学习,真的难受。
mysql的索引
mysql的索引使用b树,什么时候索引失效:其实就是如何优化sql,例如字段a是varchar,Where a = 1;此时失效,隐性转型。等等。