表锁分为:表锁和元数据锁。
---------------------------------------------------------------------------------------------
rc rr等只是针对的当前读的。
---------------------------------------------------------------------------------------------
最左前缀:
两阶段锁:
----------------------------------------------------------
分类:全局锁表锁行锁。
表锁的总结:
----
元数据锁不是我们自己控制的,是mysql自动加的。
在元数据锁不是这么认为了:DML和DQL是读锁。DDL是写锁。元数据锁与其他锁不冲突。
表锁是在mysql的server层实现的。
-------------------------------------------------------------------------------------------------------------------------------------------------
下面说行锁:是存储引擎层实现的。
行锁也是两种实现的:
MVCC:多版本的并发控制,通过对一条记录记录多个版本的方式,但是这样的话读是不加锁的。读不加锁,读写不冲突。
知识点:行锁其实是针对索引加锁的。InnoDB存储引擎,索引和数据都是存储在一起的,索引建表。B+树建表。加锁是针对B+树的叶子节点加锁的。
LBCC:基于锁的并发控制,隔离级别有关系的。隔离级别为串行化的时候才会有基于锁的并发控制。读加读锁,写加写锁。
行锁的基本演示:
InnoDB的表必须有主键,没有的话会自动加。
b没有加索引的话由行锁升级为表锁。但是InnoDB会优化的,就是加锁解锁,加锁解锁......而不是2pc
---------------------------------------------------------------------------------------------------------------------------------------
事务是事务,锁是锁,不要弄混了。事务的隔离级别可能通过锁实现的。
重点:
------------------------------------------------------------------------------------------------------------------------------------------
下半节课:只有在InnoDB才支持事务。
在常用的存储引擎中,只有InnoDB存储引擎才支持事务。
执行DDL、DML、DCL语句时,事务默认是自动提交的。
事务必须拥有四大特性:A(原子性:原子操作是不可分割的,在执行完毕不会被任何其它任务或事件中断)、C(一致性)、I(隔离性)、D(持久性)
数据库并发问题:
脏读:A事务未提交,但是B事务看到了A事务中未提交的数据。
不可重复读:针对同一条记录的。事务A对该记录,发生update操作时,事务B在事务A update操作前
后看到的该记录是不一致的。
幻读:针对同一张表。事务A对该记录,发生insert\delete操作时,事务B在事务A insert\delete操
作前后看到的记录条数是不一致的。
如何解决以上的问题呢?通过事务的隔离性(Isolation)来解决的,MySQL的隔离性有四种级别的,每一个
级别都会对应去解决以上的并发问题。
隔离级别由低到高,如下(高隔离级别,都会将低隔离能解决的问题解决掉):
Read UnCommited:读未提交,什么并发问题都解决不了。
Read Commited(RC):读已提交,可以解决脏读并发问题。
Repeatable Read(RR):可重复读,可以解决脏读、可重复读,在InnoDB存储引擎中,该隔离级别
就可以解决幻读。
Serializable:串行化,可以解决脏读、可重复读、幻读。它为什么可以解决所有问题,是因为它对读
和写都加锁,读写互相堵塞。这种方案是使用基于锁的并发控制去解决的。
MySQL默认的隔离级别是RR(可重复度),Oracle默认的隔离级别是RC。
注意事项:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
脏读幻读不可重复度:https://www.iteye.com/blog/uule-1109647
-----------------------------------------------------------------------------------------------------------------------------------
间隙锁:https://blog.csdn.net/zcl_love_wx/article/details/82382582
3.不需要关心。数据页放在缓存中。
关于事务:
事务的流程分析:
关于日志:
----------------------------------------------------------------------------------------------------------------------------------
索引:索引就是数据结构
为什么where的条件最好加索引?
索引就是一个B+ 树数据结构。主要思考的就是减少IO操作次数。
hash
数组
二叉树
多叉树(B+ 树)
B树:所有节点都会存储数据。
B+树:只有叶子节点,才会存储数据。
索引可以加快数据库的查询速度。
索引一般都是存储在磁盘中的,具体的存储方式,由存储引擎决定,比如MyISAM存储引擎,会单独使用一个
文件来存储索引数据,而InnoDB存储引擎,是将索引和表记录都存储在同一个文件中的。
其中:聚集索引、主键索引、次要索引、覆盖索引、组合索引、前缀索引、唯一索引默认都是使用B+树索引,
统称索引。
几层就是几个IO。
索引和数据一样是存在磁盘里面的。