当前位置: 首页 > news >正文

【面试系列】谈谈你对数据库ACID的理解

扫地僧又偷摸去面试了,这次面试官竟然把它问懵逼了!

面试问题

数据库的ACID是什么?

ACID是DBMS在写入或更新信息时为保证事务正确可靠所必须具备的四个特性。

  • Atomic:原子性,即所有操作要么全部成功,要么全部不成功,不存在部分操作成功,部分操作失败的情况。
  • Consistency:一致性,即事务执行前后数据库必须保持数据的合法性和正确性,比如满足主键约束、唯一性约束等。
  • Isolation:隔离性,即事务间并发执行时互不影响,相互隔离。
  • Durability:持久性,即事务一旦提交成功,则它对数据库的修改就永久保留,宕机重启等异常数据也不会丢失。

上面的问题回答的没问题,但是后面的问题扫地僧回答的一塌糊涂。

可以具体解释下ACID吗?

  • 原子性:事务的所有操作要么全部成功,要么全部失败,不会存在中间态。
    比如A给B转100元时,包含两个操作:A账户扣减100元,B账户增加100元。这两个操作必须要作为一个事务执行,保证A和B的帐户加减要么都成功要么都失败。
    在Mysql中,通过Undo日志来保证原子性:在执行数据修改前,都会将原数据写入到Undo日志中,当事务失败或RollBack时,通过Undo日志进行恢复。

  • 一致性:事务在执行过程中,必须满足预定义的业务规则和约束(如唯一性约束)。因业务实现bug导致数据不正确不属于违反事务的一致性,因为DB只保证事务执行正确,不保证业务正确。
    在Mysql中,一致性是综合结果,由原子性、隔离性、持久性共同保证的,原子性和隔离性保证数据的正确性,持久性保证事务完成后数据不会丢失,其中原子性保证数据不出现中间态,隔离性保证事务执行期间不受其他事务干扰。

  • 隔离性:多个事务并发执行互不影响,相互隔离,隔离本质上也是数据的可见性。当没有隔离时,会存在脏读不可重复读幻读等经典问题。为此,数据库提供了四种隔离级别:

    • 未提交读(Read Uncommitted)不解决任何问题,并发性最高、性能最高。
    • 已提交读(Read Committed)解决了脏读问题。
    • 可重复读(Repeatable Read)解决了脏读和不可重复读问题。
    • 串行读(Serializable)解决脏读、不可重复读和幻读问题,并发性最低,性能最差。
      在Mysql中,通过锁机制实现事务间的隔离性,默认的隔离级别是可重复读(Repeatable Read),但其通过MVCC+Gap锁解决了幻读问题。
  • 持久性:事务一旦提交,它对数据库的修改就永久保留,即使数据库崩了、宕机重启数据也不能丢。
    在Mysql中,通过Redo日志来保证持久性:在事务提交前,会将所有修改写入Redo日志文件中(物理日志),并刷盘,确保写入磁盘成功。当数据库崩溃、宕机重启时,可以通过Redo日志恢复提交成功的事务。

隔离性中多个事务执行互不影响,为什么操作同一个数据的事务会阻塞另一事务?

隔离性就是通过锁机制实现的,这里多个事务执行互不影响是指逻辑上互不影响,不是指物理上互不影响。

ACID和CAP中的C有什么区别?

虽然ACID和CAP中的C都表示一致性,但ACID中的C侧重数据合法性和正确性,而CAP中的C侧重多个数据副本间的一致性。

附录

隔离三个经典问题

  • 脏读(Dirty Read):读取另一个事务未提交的数据
  • 不可重复读(Non-Repeatable Read):一个事务中,前后查询了两次,但两次读到的数据不一样,因为被其他事务修改了。
  • 幻读(Phantom Read):一个事务中,前后查询了两次,但两次读到的数据条目数不一致,因为其他事务插入了新记录。

Mysql Redo日志刷盘时机

Mysql提供innodb_flush_log_at_trx_commit参数控制刷盘机制,取值:

  • 1:每次事务提交都刷盘,最安全,性能最差
  • 0: 每秒刷盘一次
  • 2: 依赖系统异步刷盘,性能最高,最不安全
http://www.dtcms.com/a/356730.html

相关文章:

  • 鸿蒙Next导航与路由指南:组件导航与页面路由的完美协作
  • Java中使用Spring Boot+Ollama实现本地AI的MCP接入
  • Dify平台:Agent开发初学者指南
  • Rust:所有权
  • Swift 解法详解:LeetCode 366《寻找二叉树的叶子节点》
  • SOME/IP-SD中”服务器服务组播端点”、“客户端服务组播端点”与“IPv4组播选项的区分
  • 记录:HSD部署(未完成)
  • 如何编译和使用 tomcat-connectors-1.2.32 源码(连接 Apache 和 Tomcat)​附安装包下载
  • CD71.【C++ Dev】二叉树的三种非递归遍历方式
  • 4.渗透-.DOS命令(文件目录操作)
  • 响应式编程框架Reactor【3】
  • Rust Web框架Axum学习指南之响应和异常封装
  • 如何备份 TECNO 手机上的短信
  • 云手机的安全性如何?
  • 云手机技术中都有着哪些局限性?
  • 国际期货Level2分时Tick历史行情数据处理分析
  • 关于 etree 的解析
  • 【c++题解】经典题目:带修改的 LIS 问题——CF650D Zip-line
  • 【修复软件】【缺少dll、ocx】加载失败报错无法运行注册老软件崩溃解决修复任何软件等通用方法
  • 中文PDF解析工具测评与选型指南
  • MemoryVLA:让机器人拥有“记忆“的视觉-语言-动作模型
  • 第2.1节:AI大模型之GPT系列(GPT-3、GPT-4、GPT-5)
  • 深入解析Qt节点编辑器框架:高级特性与性能优化(四)
  • 性能测试-jmeter7-元件提取器
  • 达梦数据库-归档日志(一)
  • 达梦数据库-数据文件 (二)
  • 【ShiMetaPi M4-R1】上手:RK3568B2 |开源鸿蒙(OpenHarmony) 开发板上手指南
  • dm8_静默安装简单快速
  • 第一百零二章:AI的“未来电影制片厂CEO”:多模态系统落地项目实战(完整 AI 视频创作平台)
  • mongoDB学习(docker)