MST

星途 面试题库

面试题:MariaDB中mysqld核心函数在处理事务时的调用流程是怎样的

请简述在MariaDB的mysqld核心函数体系里,当一个事务开始、执行SQL语句以及提交或回滚时,相关核心函数的调用顺序和主要交互过程。
12.4万 热度难度
数据库MariaDB

知识考点

AI 面试

面试题答案

一键面试
  1. 事务开始
    • 调用ha_transaction_start函数,这个函数主要负责启动存储引擎层面的事务。不同的存储引擎(如InnoDB)会有自己对该函数的具体实现,它会初始化事务相关的数据结构,例如InnoDB会在事务开始时创建一个事务对象,记录事务ID等信息。
    • 接着,mysql_start_transaction函数被调用,它是MySQL层面的事务启动函数。该函数会设置事务的隔离级别等相关属性,并与存储引擎进行交互,确保事务的正确初始化。在这个过程中,它会调用存储引擎的接口函数,将MySQL层面的事务设置传递给存储引擎。
  2. 执行SQL语句
    • 词法和语法分析:mysql_parse函数负责对输入的SQL语句进行词法和语法分析,将SQL语句分解成一个个的词法单元,并构建语法树。例如,对于SELECT * FROM table_name语句,它会识别出SELECT关键字、表名等元素。
    • 查询优化:optimize_sql函数基于语法树进行查询优化。它会分析不同的执行路径,选择最优的方案。例如,对于多表连接查询,它会考虑不同的连接顺序,评估使用索引的可能性等,以生成最优的查询计划。
    • 执行计划执行:execute_sql函数根据优化后的查询计划来执行SQL语句。在执行过程中,会调用存储引擎的相关函数,如ha_read_row(用于读取数据行)、ha_write_row(用于写入数据行)等。如果是更新语句,还会涉及到锁的操作,通过调用lock_row等函数来获取相应的锁,以保证数据的一致性。对于InnoDB存储引擎,执行过程还会涉及到日志记录,调用log_write等函数将修改操作记录到重做日志和回滚日志中。
  3. 事务提交
    • 首先调用mysql_commit函数,该函数通知存储引擎准备提交事务。它会检查事务的状态,确保事务处于可提交状态。
    • 然后存储引擎层面调用ha_commit_trans函数。以InnoDB为例,这个函数会将重做日志刷盘(调用log_flush等函数),保证事务的持久性。同时,会清理事务相关的锁资源(调用unlock_row等函数),释放占用的资源。最后,标记事务已提交,完成事务提交操作。
  4. 事务回滚
    • 调用mysql_rollback函数,它同样是通知存储引擎进行事务回滚。
    • 存储引擎调用ha_rollback_trans函数。对于InnoDB,该函数会根据回滚日志(调用rollback_from_log等函数)将数据恢复到事务开始前的状态,撤销已经执行的修改操作。并且也会清理锁资源,释放事务占用的资源,完成事务回滚。