1. 我是皮皮虾首页
  2. 网站部署

python后端开发面试-mysql数据库

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/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注