谈谈数据库事务和隔离级别。讲讲数据库的锁。⭐⭐⭐
    关键点基本
    回答逻辑
    1、先讲下事务 事务可以使「一组操作」要么全部成功,要么全部失败
    2、讲下事务的特性 ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
    3、讲事务的隔离级别和对应问题。未提交读(脏读)、已提交读(不可重复读、幻读)、可重复读(幻读)、串行化
    4、讲锁 读锁(共享锁)、写锁(排它锁);表锁、行锁;乐观锁、悲观锁
    拓展问题
    · 数据库有哪些隔离级别,可能会产生什么问题
    · 分别有哪些锁

    面试官一口气问了MySQL事务、锁和MVCC,我 - 掘金
    什么是脏读,不可重复读,幻觉读?扶墙的老汉-CSDN博客脏读

    基础知识
    ACID
    原子性(Atomicity)
    ○通过undo log来保证、undo log记录数据修改前的信息、通过反向记录(记录+1,他就记录-1,删、他就增)实现回滚。要不成功全部执行,要不不成功回滚undo log。
    一致性(Consistency)
    ○就是事务的目的,保证执行结果的一致性。
    隔离性(Isolation)
    ○事务并发可能产生 脏读、重复度、幻读等问题,需要定义隔离级别来解决上面问题。
    ○未提交读、已提交度、可重复读、串行化;隔离级别依次上升。
    ○隔离级别是通过各种锁来实现的
    持久性(Durability)
    ○一旦提交,数据就持久的存下来了,mysql通过redo log来对数据进行记录,保证即时内存写完宕机没写入磁盘,也可以通过redo log来重现之前执行的数据操作。
    隔离级别的理解
    先理解几种问题
    脏读:一次事务中,读到其他事务未提交的内容
    不可重复读:一次事务中,可以看见其他事务提交的内容,导致两次读的内容不同(update)
    幻读 : 一次事务中,可以看见其他事务的(insert,delete)导致两次读取不一样。
    未提交读
    ○性能最好,隔离级别最差,其他事务没提交的内容也会被其他事务读到
    ○产生问题:脏读 (读到被人没提交的数据)
    已提交读
    ○只有提交的内容才会被其他事务可见
    ○产生问题:不可重复读(事务A执行过程中,能看到其他事务提交的修改,导致一次事务内多次查询结果不一致)
    可重复读
    ○采用MVCC,读时不更新版本,一次事务中读到的内容保持一致。
    串行化
    ○性能最低、隔离级别最高

    谈谈redo log和undo log ⭐
    必须了解的mysql三大日志-binlog、redo log和undo log - 掘金
    ○undo log用于回滚,是倒着执行
    ○redo log是重现,写入磁盘的地方就标记,恢复数据就是从标记点顺序执行。

    讲讲MVCC问题。⭐
    可以理解成是github的提交机制,本质就是版本对比来实现读写不阻塞。「版本」其实就是对应快照的数据

    MVCC 通过 read view undo log来实现的
    ●read view :
    ○trx_ids(尚未提交commit的事务版本号集合)
    ○low_limit_id(下一次要生成的事务ID值)
    ○low_limit_id(尚未提交版本号的事务ID最小值)
    ○creator_trx_id(当前的事务版本号)
    undo log
    ○记录版本及数据用于版本回滚对比
    ○数据库每行数据都有两列隐藏字段:DB_TRX_ID(记录着当前ID)以及DB_ROLL_PTR(指向上一个版本数据在undo log 里的位置指针)
    事务的commit会导致版本变更,一次事务内会根据不同版本获取不同数据。

    不同的隔离级别(read commit和repeatable read),无非就是read commit隔离级别下,每次都获取一个新的read view(可以及时看见其他事务的变更),repeatable read隔离级别则每次事务只获取一个read view(保证事务对其他事务的变更不可见)。

    全网最全一篇数据库MVCC详解,不全你打我 - 掘金
    讲讲死锁的四个条件,Mysql如何处理死锁。

    数据库的锁机制 及 锁优化⭐
    理解锁的机制

    全面了解mysql锁机制(InnoDB)与问题排查 - 掘金
    ●尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
    ●合理设计索引,尽量缩小锁的范围
    ●尽量减少检索条件范围,避免间隙锁
    ●尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
    ●尽可能低级别事务隔离
    说说MySQL死锁问题,以及你是如何解决的⭐

    搜狐三面:说说你是怎么解决MySQL死锁问题的! - 掘金