【事务专题】事务基础问题连环炮

本问题对应的项目链接:高频题回答模版训练

事务的问题,可深可浅,深的一般会涉及日志相关,一般互联网大厂才问,平时的公司,掌握基础的也差不多了。

1、你是怎么理解事务的?说一下你的理解

2、事务的十大特性了解吗?介绍一下解释一下

3、事务有好几种隔离级别,介绍一下常见的有哪些?主要解决了哪些问题呢?又各自存在哪些问题呢?

4、快照了解吗?介绍一下

5、快照读在提交读和可重复读级别下有什么区别?

共以下 2 个回答

  • 終达·斯维达尼亚 永久会员 2024年2月17日 上午12:56

    1、你是怎么理解事务的?说一下你的理解

    事务的本质就是一系列操作必须全部成功执行,如果其中出现任何异常则整体程序回滚到最初的样貌。保证数据的一致性和完整性

    2、事务的四大特性了解吗?介绍一下解释一下

    • 原子性:事务的一组操作要么全部成功要么全部回滚
    • 隔离性:事务之间的操作是互不干扰的
    • 持久性:事务提交之后数据会存储在某个介质中,系统故障也能恢复
    • 一致性:事务在执行前后必须保证数据库的一致状态,不能破坏数据库的约束条件

    3、事务有好几种隔离级别,介绍一下常见的有哪些?主要解决了哪些问题呢?又各自存在哪些问题呢?

    • 读未提交:当一个事务未提交的时候其他线程可以读取该事务内部的数据。可能会存在脏读的情况,即读到未提交的数据
    • 读已提交:某个线程只能读取已提交的事务。可能会存在不可重复读的情况
    • 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。可能存在幻读的问题,即其他线程发送写操作后前后读取数据不一致的问题。其中innodb加入了间隙锁的机制来防止幻读。
    • 串行化:安全性最高的隔离级别,每次读写的时候都会加锁,导致性能较差。

    4、快照了解吗?介绍一下

    快照就是数据库在某个时间点的状态记录,它可以保留数据库在特定时间的一致性状态,从而提供数据恢复,备份,事务的一致性等功能。不过 MySQL 快照读中的快照,并不是对整个库的快照,它本质是用 undo log + MVCC 实现的一致性视图。在 RR 隔离级别下,当一个事务开始时,会生成唯一的事务 ID,当事务需要更新数据时,MySQL 并不会直接修改原始数据,而是将原始数据先复制一份,并将其版本号 +1,再将更新的内容写进 undo log。这样,在并发读取数据时,每个事务都能通过当前版本和 undo log 计算出对应的数据版本,从而得到正确结果。

    5、快照读在提交读和可重复读级别下有什么区别?

    在可重复读隔离级别下,只需要在事务开始时创建一个快照,只后事务里的其他查询都共有这一个快照。在读提交隔离级别下,每一个语句执行前都会重新创建一个新的快照

    0 赞同 0 条回复
  • 秊 永久会员 2023年8月9日 下午10:54

    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。

    0 赞同 0 条回复

# 回答此问题

后才能回答