谈谈数据库事务和隔离级别。讲讲数据库的锁。⭐⭐⭐
关键点基本
回答逻辑
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死锁问题,以及你是如何解决的⭐