Mysql隔离级别
- 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
- 幻读(Phantom Read):在一个事务的两次查询中数据count不一致,例如有一个事务查询了3 条数据,而另一个事务却在此时插入了1条数据,先前的事务在接下来的查询中,就会发现1条数据是它先前所没有的。出现的根本原因:
- 读取的时候没有加锁
- 当前读和快照读并存
- 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间,有一个事务更新了原有的数据。
由低到高依次为
- Read uncommitted 读未提交,可以脏读,场景:交易行情,允许数据已经插入,但是没有提交就可以读取
- Read committed 读已提交,(RC级别)每次都是当前读,读取的是最新记录,所以不会出现不可重复读取的问题。
- Repeatable read 可重复读(RR级别)
- 在事务开启后,第一次读取的时候会生成readview,此后读取的都是快照读,所以这种情况下不会出现幻读
- 但是如果生成快照读之后,还做了update操作,就会把快照读变为当前读,也就是当快照读和当前读并存的时候会出现幻读,解决方法就是加锁。
- 当前2个事务,事务一和事务二,事务二更新了一条记录并且commit了,那事务一能否读取到事务二的更新记录,关键在于readview生成的时机,如果事务一readview生成是在事务二commit之后,那事务一是可以读取到事务二的update的数据,如果事务一readview生成是在事务二commit之前,那就是读取不到事务的提交的记录。
- Serializable 最严格的,不能脏读,不可重复度,不能幻读
什么是索引
索引是一种提高查询速度的数据结构,在mysql中有B树、B+树,Hash表等数据结构
事务的ACID特性
- 原子性:事务要么全部执行,要么全部不执行(通过)
- 一致性:事务执行前和执行后必须保持一致性
- 隔离性:事务并发的时候是相互隔离的,互不影响(通过mvcc实现)
- 持久性:事务发生后会写入库中,也就是本地磁盘,永久存在的。(通过)
innodb为啥选择B+树
Mysql中有哪些引擎
innodb
优点:
- 支持事务、外键
- 行级别的锁
- 聚簇索引
myisam
优点
- 支持全文索引
- 查询更快
缺点
- 不支持事务
- 不支持外键
- 表级别的锁定
- 不支持哈希索引
隔离级别,分别解决脏读、幻读、可重复读
innodb默认隔离级别是什么
可重复读
- 那如果在业务上实现可重复读,怎么做呢?
select * from table where id = 1 执行顺序是什么?
select c from table where a = ? and b = ? 如何设计索引
select c from table where a= 1 for update 当1不存在的时候会发现什么
gap锁
你工作中建索引有什么方法论吗?
原创文章,作者:站长,如若转载,请注明出处:https://wsppx.cn/653/%e7%bd%91%e7%ab%99%e9%83%a8%e7%bd%b2/