返回

元数据锁:事务、redo日志、undo日志背后的原理

后端

事务及其隔离性

事务的概念 :事务是一系列必须原子执行的操作,即要么全部执行,要么不执行。

事务的四大特性:ACID

  • 原子性 (Atomicity) :一个事务中包含的所有操作要么全部成功,要么全部失败,并且只能处在这两种状态的其中之一。
  • 一致性 (Consistency) :事务前后数据库处于一致状态,保证数据库中的数据符合某种规则(例如:主外键关系约束)。
  • 隔离性 (Isolation) :多个事务并发执行时,相互独立,互不影响。
  • 持久性 (Durability) :一旦事务完成,其对数据库所做的改动将被永久保存。

元数据锁

元数据锁 是指InnoDB引擎用于保护数据字典及其相关信息(例如表定义和索引定义)的锁。

元数据锁的分类

  • 表锁 :锁住整个表,任何涉及该表的查询或更新操作都必须等待表锁释放。
  • 行锁 :锁住表的某一行,其他事务可以读取或更新该表中的其他行,但不能对被锁定的行进行任何操作。
  • 页锁 :锁住表的某一页,其他事务可以读取或更新该表中的其他页,但不能对被锁定的页进行任何操作。

元数据锁的应用

  • 保护数据字典,防止其被并发事务修改。
  • 防止死锁:例如,如果事务A持有表锁,而事务B试图更新该表中的某一行,则事务B将被阻塞,直到事务A释放表锁。
  • 提高并发性:例如,如果事务A持有表锁,而事务B试图读取该表中的某一行,则事务B可以继续执行,因为读取操作不会对数据造成修改。

Redo日志和Undo日志

Redo日志 :记录了事务对数据库所做的修改,用于在事务提交时将这些修改持久化到磁盘。

Undo日志 :记录了事务对数据库所做的修改的逆向操作,用于在事务回滚时撤销这些修改。

Redo日志和Undo日志的作用

  • 确保事务的原子性和持久性:如果事务在提交之前发生故障,则可以根据Redo日志恢复对数据库所做的修改。如果事务在提交之后发生故障,则可以根据Undo日志撤销对数据库所做的修改。
  • 支持多版本并发控制:MVCC(Multi-Version Concurrency Control)是一种并发控制机制,它允许多个事务同时访问同一个数据项。当一个事务读取数据项时,它将看到该数据项在该事务开始时的值。当一个事务修改数据项时,它将创建一个该数据项的新版本,而其他事务仍然可以看到该数据项的旧版本。
  • 提高性能:Redo日志和Undo日志可以帮助提高数据库的性能,因为它们可以减少对磁盘的访问次数。例如,如果一个事务多次修改同一个数据项,则只需要将该数据项的修改记录到Redo日志中,而不需要每次修改都将该数据项写入磁盘。

总结

事务、元数据锁、Redo日志和Undo日志是数据库系统中不可或缺的关键技术。它们共同协作,确保了数据库的可靠性和一致性,并提高了数据库的性能。