前言:
开始分享之前,博客主要是为了记录学习。在学习过程中不免会出现错误,也欢迎大家在评论区指正。我会认真回复大家的。谢谢!!
内容介绍
- 主要学习数据库基本知识,以及数据库中比较重要的存储引擎,事务和隔离,索引,还有锁。
- 主要来源于八股文资料,b站,面试鸭
学习总结
另外有些内容在思维导图上写不太多,就大致的写了,我在MarkDown上已经编写了
数据库对事务的支持
一、数据库事务的基本特性
注:(ACID,这些确保事务的一致性和可靠性)
1.原子性(Atomicity):事务被视为一个不可分割的工作单位,事务中的所有操作要么全部提交成功,要么全部失败回滚,对于其他事务的操作是不可见的
2.一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。一致性与原子性是密切相关的
3.隔离性(Isolation):数据库系统提供一定的隔离机制,使得并发执行的事务之间不会互相干扰,每个事务都感觉自己是在一个单独的环境中执行
4.持久性(Durability) :一旦事务提交,则其所做的修改就会永久保存在数据库中,即使发生系统崩溃也不会丢失
二、数据库事务的隔离级别
注:(避免事务之间的干扰,来控制事务的可见性和一致性)
- 读未提交(Read Uncommitted):允许另外一个事务可以看到这个事务未提交的数据,这可能导致脏读、不可重复读和幻读。安全性太差。
- 读已提交(Read Committed):确保事务只能读取已经被其他事务提交的数据,这可以避免脏读,但可能出现不可重复读和幻读。大多数据库默认隔离级别。
- 可重复读(Repeatable Read):保证在同一个事务中多次读取同样记录的结果是一致的,这可以避免脏读和不可重复读,但可能出现幻读。MySQL的默认隔离级别
- 可串行化(Serializable):这是最高的隔离级别,它通过强制事务串行执行,来避免脏读、不可重复读和幻读。但这种方式会严重影响并发性能。
- 补充
1.脏读:所有事务都能读取到别的事务中未提交的数据
2.可重复读:在并发读取数据的时候会读取到不一样的数据
3.幻读:当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户在读取该范围的数据行时,会发现有新的“幻影”行
怎么解决幻读:在InnoDB和Falcon存储引擎通过多版本并发控制(MVCC)机制解决了该问题
三、数据库事务的并发控制
注:(多个事务对共享资源的访问,确保事务的隔离性和一致性)
- 锁(Locking):通过锁定数据库中的资源(如表、行等)来防止其他事务对这些资源的访问,从而保证事务的隔离性。锁的类型包括共享锁和排他锁等。
- 时间戳排序(Timestamp Ordering):给每个事务分配一个时间戳,根据时间戳的先后顺序来确定事务的执行顺序,从而解决事务之间的冲突。
- 多版本并发控制(MVCC):允许事务在数据库中创建多个版本的数据,每个版本都有一个时间戳,读操作可以选择特定时间点或时间段的数据版本,从而实现对历史数据的访问。
四、数据库事务的提交与回滚
提交(Commit):当事务中的所有操作都成功执行后,事务会被提交,所做的修改会被永久保存到数据库中。
回滚(Rollback):如果事务在执行过程中遇到错误或需要撤销操作,事务会被回滚到事务开始前的状态,所做的修改会被撤销。
- 什么情况下会出现异常:
1.数据库连接问题:事务执行期间,数据库连接中断或数据库不可用
2.违反数据库约束:数据不符合要求
3.死锁:多个事务相互等待对方释放资源
4.超时:如果设置最大时间限制可能会出现
5.程序错误
6.并发错误:不正确地处理并发控制,可能会导致事务异常
7.资源耗尽
8.操作中断:硬件损坏啥的强制打断
五、数据库事务的分类
注:(根据事务涉及的节点数量,事务可以分为集中式事务和分布式事务)
- 集中式事务:单个节点参与的事务,如单个数据库实例中的事务。
- 分布式事务:由多个节点参与的事务,这些节点可能分布在不同的数据库实例或不同的地理位置上。分布式事务需要确保所有节点上的操作都成功执行,否则需要回滚所有节点的操作。
心得体会
内容大致上是还是存在缺陷的,这仅是我现在所收集到的内容。
学习了一遍之后,还是得多看多记多去了解和使用。
- 还有一个目标就是MySql的优化