Mysql面试全解(二)

57 阅读4分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

事务

四大特性

原子性Atomicity一致性Consistency隔离性Isolation持久性Durability
解释事务是最小的单位,不允许进行分割,事务执行之前和执行完成之后这个 业务数据的状态是一致的(不会出现中间状态的数据)多个事务执行期间对数据的修改不会相互影响事务执行完成之后,对数据的修改会保存在数据库中,不会再有回滚的操作出现
详细解释事务所执行的操作要么都完成要么都失败这个一致性其实很多概念解释的都很模糊,比如 1. 事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。 2. 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。 其实这些说法也对,但是没有说到点子上去 就拿上面转账来说,事务的一致性其实就是多个事务看这个总钱数,无论是这个事务之前前还是执行后,都是一样的.也就是别的事务不会看到这个事务执行期间的中间状态(中间状态从A扣钱和给B加钱肯定是有个顺序的,这个时候钱的总数肯定的少了或者多了的) 那么就有的人会问了,那么这个概念不是和原子性一致了嘛 原子性关注于状态,要么都成功要么都失败 而一致性关注于数据,保证事务执行期间的这个数据不会超脱于业务之上多个事务执行期间,对同一条数据不会产生影响
实现方式使用undo log实现一般由代码层面来保证通过加锁和MVCC去实现的使用的redo log实现的
实现方式详解1. 在操作任何数据之前,都先将数据备份到另一个地方(这个地方称之为undo log) 2. 然后就行数据修改 3. 如果出现异常或者执行了rollback操作,系统就使用undo log中的数据将数据恢复到事物执行之前的状态1. 操作任何数据的时候,都将操作之后的数据进行备份到一个地方(这个地方就叫做redo log) 2. 事务提交之前将redo log持久化 3. 如果 系统出现崩溃则可以直接使用redo log恢复数据

事务并发的问题

  • 脏读(Dirty read): (读取了后来回滚的操作)事务A读取了事务B未提交的数据修改,事务B又回滚了(读了不该读的数据)
  • 幻读(Phantom read): (我以为我读取了全部)事务A读取了全部学生进行操作,结果事务B又加了学生(幻想自己读了所有)
  • 不可重复读(Unrepeatableread): (我读取的数据被修改了)事务A读取的数据被事务B修改并提交了(同一个事务读的两次结果不一样了)与幻读的区别在与幻读针对新增和删除.不可重复度在于修改

理解起来很好理解,就是容易记混,哈哈哈

隔离级别

读未提交读已提交可重复读串行化
英文及简写Read UnCommitedRead Commited(RC)Repeatable Read(RR)Serializable
概念别的事务可以读到这个事物未提交的数据变更该事务的数据变更只有在提交之后才能被别的事务读取到在一个事务的过程中每次获取的数据都是一样的(即使有别的事务修改了数据并提交了)所有事务都是依次执行
避免的问题 (重复读、脏读、幻读)null脏读(MVCC解决可重复读问题)脏读和重复读所有
数据库默认oracle默认mysql默认
备注MVCC解决可重复读问题为了解决可重复读的问题,Mysql使用了MVCC的方式。为了解决幻读的问题,Mysql使用了间隙锁。在该隔离级别上都有体现
生成readView的时机(MVCC作用在RR和RC上不同的原因)事务中每次select都会生成一个readView每个事务创建一个readView

在启动参数中设置transaction_isolation即可配置事务隔离级别,查看当前隔离级别show variables like 'transaction_isolation'默认隔离级别是“可重复读”