数据库知识点总结

MySQL事务,锁,索引学习总结

什么是事务

事务是逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败。

事务的特性

原子性:事务是最小的逻辑单位,不可分割。
一致性:事务执行的前后数据的完整性保持一致。
隔离性:一个事务的执行过程中,不应该受到其他事务的干扰。
永久性:事务一旦结束,数据就会持久到数据库。

安全性问题

脏读:一个事务读到了另一个事务没有提交的数据。
不可重复读:一个事务读到了另一个事务提交的update数据,导致多次读到的数据不一致。
幻读:一个事务读到了另一个事务提交的insert数据,导致多次查询的结果不一致。

事务的隔离级别

读未提交:不解决问题。
读已提交:可以解决脏读。
可重复读:可以解决脏读,不可重复读。
串行化:解决所有安全性问题。

MySQL:默认读已提交
Oracle:默认可重复读

聚簇索引

innoDb使用的是聚簇索引,索引底层使用b+树,b+树叶子节点储存着记录的内容。

非聚簇索引

myisam使用的是非聚簇索引,索引底层使用的是b+树,b+树叶子节点储存记录的地址。

索引类型

普通索引:仅加速查询
唯一索引:索引列的值必须唯一,但允许有空值
复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。
PS:此外复合索引使用需要符合最左原则。因为b+树将第一个条件作为索引,其他条件放在叶子节点。

MVCC

MVCC:多版本并发控制,指的是在使用读已提交,可重复读在执行普通的select操作时访问记录的版本链的过程。可以使不同事务的读-写,写-读操作并发执行,从而提高系统的性能。
读已提交和可重复读的不同就是生成readview的时机不同。读已提交在每一次进行普通select操作前都会生成一个readview,而可重复读只有在第一次进行普通select操作前生成一个readview,之后的操作都使用这个readview就好。

比如:
读已提交:
A(1) = 1 B(2) = 2
A:select readview:m_ids[2,3,4]
B:commit
A:select readview:m_ids[3,4]
A事务查,生成readview,readview中的m_ids属性记录着活跃的事务id(还没有提交的事务id),A事务不会去查该m_ids里面的版本数据。因此不会查到别人还没提交的数据,所以没有脏读的情况。
B事务提交后,A事务再去查,生成readview,readview中的m_ids[3,4],因此可以查到事务id为2的版本的数据,因此会查到别的事务更新的数据。

可重复读:
A(1) = 1 B(2) = 2
A:select readview:m_ids[2,3,4]
B:commit
A:select readview:m_ids[2,3,4]
在事务a中只生成一次readview,因此不会查到别的事务update的数据。B事务提交前后查到的数据是一样的。

共享锁:允许读取一个数据,同时允许其他事务来读取数据。
排他锁:允许当前事务修改数据,但是不允许其他的所类型。

在读已提交中:只会对查询到的记录加锁(无论查询的条件是否是主键或者索引)。

在可重复读中:如果查询的条件是主键或者索引那么只会对查询到的记录加锁,如果不是主键或者索引,那么会对整张表加锁。
比如select * from t where c = ‘1’ c字段不是主键或者索引,那么在查询之后,b事务update别的记录设置c=‘1’,再执行查询语句,查到的是别人更新的记录。不符合可重复读隔离级别。因此,在可重复读中需要锁住整张表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值