【 Java 面试八股文】系列会陆续更新 Java 面试中的高频问题,旨在从问题出发,理解 Java 基础,数据结构与算法,数据库,常用框架等。该系列前几期文章可以通过下方给出的链接进行查看~
按照惯例——首先要做几点说明:
- 【 Java 面试八股文】中的面试题来源于社区论坛,书籍等资源;感谢使我读到这些宝贵面经的作者们。
- 对于【 Java 面试八股文】中的每个问题,我都会尽可能地写出我自己认为的“完美解答”。但是毕竟我的身份不是一个“真理持有者”,只是一个秉承着开源分享精神的 “knowledge transmitter” & 菜鸡,所以,如果这些答案出现了错误,可以留言写出你认为更好的解答,并指正我。非常感谢您的分享。
- 知识在于“融释贯通”,而非“死记硬背”;现在市面上固然有很多类似于“Java 面试必考 300 题” 这类的文章,但是普遍上都是糟粕,仅讲述其果,而不追其源;希望我的【 Java 面试八股文】可以让你知其然,且知其所以然~
1、什么是事务?
答
在计算机术语中,事务(Transaction)指的是访问并可能更新数据库中各种数据项的一个程序执行单元。
我们为什么需要事务?
事务是为了解决数据安全操作提出的解决方案,事务的控制实际上就是控制数据的安全访问与隔离。
举一个简单的例子:
银行转账,A 账户将自己的 1000 元转账给 B ,那么业务实现的逻辑首先是将 A 的余额减少 1000,然后往 B 的余额里增加 1000,假如这个过程中出现意外,导致过程中断,A 已经扣款成功,B 还没来得及增加,就会导致 B 损失了1000 元。所以我们必须做出控制,要求 A 账户转帐业务撤销,这才能保证业务的正确性,完成这个操作就需要事务,将 A 账户资金减少和 B 账户资金增加放到同一个事务里,要么全部执行成功,要么全部失败,这样就保证了数据的安全性。
事务有四大特性(ACID):
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)。
原子性是指事务是应用中不可再分的最小执行体,即事务包含的一系列操作要么全部成功,要么全部失败并回滚(rollback),绝对不存在部分成功或者部分失败的情况。
一致性指的是:保证事务遵循对数据的完整性约束。完整性约束在数据库层面上包含主键约束,唯一索引约束,外键约束等,在业务逻辑上是我们通过程序人为规定的。事务的一致性保证了事务会从一个正确有效的状态转移到另一个正确有效的状态。而正是这些约束规定了一个状态是正确有效的还是错误的~
隔离性是最重要的一点,当有多个用户以并发的方式操作数据库时,事务是彼此隔离的,不会被其他的事务干扰或影响。
永久性是指一个事务一旦提交,那么对数据库中数据的改变就是永久的,即便数据库发生了故障也不会丢失事务提交的数据。
接下来,我们来看一下事务的隔离级别。
当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read),不可重复读(non-repeatable read),幻读(phantom read)这些问题,为了解决这些问题,就有了 MySQL 隔离级别的概念。在了解 MySQL 的隔离级别之前,我们先来了解一下什么是脏读,幻读与不可重复读。
1. 脏读
如上图所示,脏读是指当事务 A 正在访问数据,并且对数据进行了修改,而这个修改还没有提交到数据库中,此时另一个事务 B 也访问到了这个数据,然后使用了这个数据,结果事务 A 发生回滚,那么事务 B 读到的就是一个“脏数据”。
2. 不可重复读
不可重复读是指在一个事务内 ,多次读同一数据。例如:事务 B 读取某一数据,在事务 B 还没有结束时,另外一个事务 A 也访问了该同一数据,并且修改了这一数据。那么,在事务 B 的两次读数据之间,由于事务 A 对数据的修改,导致事务 B 两次读到的的数据可能是不一样的,这就是不可重复读。例如,一个编辑人