【事务专题】事务基础问题连环炮
本问题对应的项目链接:高频题回答模版训练
事务的问题,可深可浅,深的一般会涉及日志相关,一般互联网大厂才问,平时的公司,掌握基础的也差不多了。
1、你是怎么理解事务的?说一下你的理解
2、事务的十大特性了解吗?介绍一下解释一下
3、事务有好几种隔离级别,介绍一下常见的有哪些?主要解决了哪些问题呢?又各自存在哪些问题呢?
4、快照了解吗?介绍一下
5、快照读在提交读和可重复读级别下有什么区别?
本问题对应的项目链接:高频题回答模版训练
事务的问题,可深可浅,深的一般会涉及日志相关,一般互联网大厂才问,平时的公司,掌握基础的也差不多了。
1、你是怎么理解事务的?说一下你的理解
2、事务的十大特性了解吗?介绍一下解释一下
3、事务有好几种隔离级别,介绍一下常见的有哪些?主要解决了哪些问题呢?又各自存在哪些问题呢?
4、快照了解吗?介绍一下
5、快照读在提交读和可重复读级别下有什么区别?
共以下 2 个回答
1、你是怎么理解事务的?说一下你的理解
事务的本质就是一系列操作必须全部成功执行,如果其中出现任何异常则整体程序回滚到最初的样貌。保证数据的一致性和完整性
2、事务的四大特性了解吗?介绍一下解释一下
3、事务有好几种隔离级别,介绍一下常见的有哪些?主要解决了哪些问题呢?又各自存在哪些问题呢?
4、快照了解吗?介绍一下
快照就是数据库在某个时间点的状态记录,它可以保留数据库在特定时间的一致性状态,从而提供数据恢复,备份,事务的一致性等功能。不过 MySQL 快照读中的快照,并不是对整个库的快照,它本质是用 undo log + MVCC 实现的一致性视图。在 RR 隔离级别下,当一个事务开始时,会生成唯一的事务 ID,当事务需要更新数据时,MySQL 并不会直接修改原始数据,而是将原始数据先复制一份,并将其版本号 +1,再将更新的内容写进 undo log。这样,在并发读取数据时,每个事务都能通过当前版本和 undo log 计算出对应的数据版本,从而得到正确结果。
5、快照读在提交读和可重复读级别下有什么区别?
在可重复读隔离级别下,只需要在事务开始时创建一个快照,只后事务里的其他查询都共有这一个快照。在读提交隔离级别下,每一个语句执行前都会重新创建一个新的快照
1、你是怎么理解事务的?说一下你的理解
事务是指一系列的数据库操作组合成一个逻辑单元,要么全部执行,要么全部回滚,避免了数据操作的中间状态。它提供了一种可靠的方式来管理数据库中的操作,确保数据的一致性和完整性。
2、事务的四大特性了解吗?介绍一下解释一下
事务的四大特性分别是原子性,一致性,隔离性和持久性。
原子性是指:事务的执行是一个原子操作,要么全部执行成功,要么全部失败回滚。拿 A 用户向 B 用户转账举例,在数据库中,包括读出 A 用户的余额,减去转账数,写回 A 用户账号,读出 B 用户余额,加上转账数,写回 B 用户账号。事务确保了整个过程要么全部不执行,要么全部都执行,不会出现只给 A 减去了余额而没有给 B 加上余额的情况。
一致性是指:事务在执行前后,都必须保证数据库的一致状态,不能破坏数据库的完整性约束条件。也就是说,如果转账过程中违反了数据库中,余额不能为负的约束条件,整个事务将会被回滚。
隔离性是指:多个并发的事务之间不会相互干扰。假如 A 和 B 同时与 C 进行转账,事务的隔离性确保 A 和 B 的转账像是在独立运行,互不干扰。
持久性是指:一旦事务提交成功,事务的结果会记录在某个存储介质中,系统故障时也能及时恢复。
3、事务有好几种隔离级别,介绍一下常见的有哪些?主要解决了哪些问题呢?又各自存在哪些问题呢?
MySQL 的事务共有四种隔离级别,分别是读未提交,读提交,可重复读:
读未提交,就是一个事务还没提交时,它做的变更就能被别的事务看到。这种隔离级别具有最高的并发性,但也存在严重的问题,如脏读和不可重复读。
读提交,一就是个事务提交之后,它做的变更才会被其他事务看到。在该级别下,一个事务只能读取到其他事务已经提交的数据。这种隔离级别解决了脏读的问题,但仍可能遇到不可重复读的问题。
可重复读,就是一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。这种隔离级别解决了不可重复读的问题,但可能会遇到幻读的问题。
串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。这种隔离级别提供了最高的数据一致性,但并发性最差,可能导致大量的锁竞争和性能问题。
4、快照了解吗?介绍一下
快照就是数据库在某个时间点的状态记录,它可以保留数据库在特定时间的一致性状态,从而提供数据恢复,备份,事务的一致性等功能。
不过 MySQL 快照读中的快照,并不是对整个库的快照,它本质是用 undo log + MVCC 实现的一致性视图。在 RR 隔离级别下,当一个事务开始时,会生成唯一的事务 ID,当事务需要更新数据时,MySQL 并不会直接修改原始数据,而是将原始数据先复制一份,并将其版本号 +1,再将更新的内容写进 undo log。这样,在并发读取数据时,每个事务都能通过当前版本和 undo log 计算出对应的数据版本,从而得到正确结果。
5、快照读在提交读和可重复读级别下有什么区别?
主要的区别在于快照生成的时间不同,在可重复读隔离级别下,只需要在事务开始时创建一个快照,只后事务里的其他查询都共有这一个快照。在读提交隔离级别下,每一个语句执行前都会重新创建一个新的快照,所以 RC 下的 start transaction with consistent snapshot 语句等同于普通的 start transaction。